2014-06-17 01:51:35 +0000 2014-06-17 01:51:35 +0000
19
19

PowerShell ottiene l'elenco delle cartelle condivise

Sto cercando di ottenere un elenco di cartelle che sono condivise su una condivisione di file. Al momento ho due cartelle di prova:

\MYPC\Test1

\MYPC\Test2

Questo è il codice che ho al momento:

$FileServer = Read-Host "Enter file server to search"
$FolderList = Get-ChildItem -Path $FileServer

Write-Host $FolderList

Ma questo si presenta con “impossibile trovare il percorso”. Posso vedere esempi di come fare questo per \Server\Share come directory, ma è possibile cercare solo in \Server?

Risposte (8)

24
24
24
2014-06-17 02:38:03 +0000

Prova questo:

get-WmiObject -class Win32_Share -computer dc1.krypted.com

Rif: List Shares in Windows w/ PowerShell _

14
14
14
2014-06-17 02:58:41 +0000

C'è solo un modo di enumerare le azioni in remoto dalla linea di comando che conosco, ed è con net view:

C:\Users\mark.henderson>net view \enetsqnap01
Shared resources at \enetsqnap01

Share name Type Used as Comment

-------------------------------------------------------------------------------
Backups Disk
CallRecordings Disk
Download Disk System default share
home Disk Home
homes Disk System default share
Installs Disk
Justin Disk Copy of files from Justin laptop
michael Disk
Multimedia Disk System default share
Network Recycle Bin 1 Disk [RAID5 Disk Volume: Drive 1 2 3 4]
Public Disk System default share
Qsync Disk Qsync
Recordings Disk System default share
Sales Disk Sales Documents
SalesMechanix Disk
Server2012 Disk Windows Server 2012 Install Media
Usb Disk System default share
VMWareTemplates Disk
Web Disk System default share
The command completed successfully.

Questo non è particolarmente analizzabile da solo, ma, potete gettarlo in un array per elaborare i dati linea per linea:

$sharedFolders = (NET.EXE VIEW \enetsqnap01)

Ora avete un array, e a partire da $sharedFolders[7] avete le vostre azioni. Potreste poi split su qualcosa come un doppio spazio - improbabile che appaia nel nome stesso di un'azione, e dovrebbe funzionare a meno che il vostro nome dell'azione sia molto lungo, lasciando solo un singolo spazio tra il nome dell'azione e il campo del tipo:

$sharedFolders[7].split(' ')[0]
Backups

Potreste processare questi usando un ForEach e qualche logica condizionale. Non sarebbe perfetto, ma dovrebbe funzionare per la maggior parte dei casi d'uso.

Per brevità, per mostrare solo i nomi dei file alla console:

(net view \enetsqnap01) | % { if($_.IndexOf(' Disk ') -gt 0){ $_.Split(' ')[0] } }
8
8
8
2016-05-09 14:46:58 +0000

Se volete trovare le azioni della macchina locale potete semplicemente fare Get-SmbShare:

> Get-SmbShare

Name ScopeName Path Description
---- --------- ---- -----------
ADMIN$ * C:\WINDOWS Remote Admin
C$ * C:\ Default share
3
3
3
2015-09-15 02:19:32 +0000

Espandendo la risposta di Mark Henderson :

$Servers = ( Get-ADComputer -Filter { DNSHostName -Like '*' } | Select -Expand Name )
foreach ($Server in $Servers)
{
    (net view $Server) | % { if($_.IndexOf(' Disk ') -gt 0){ $_.Split(' ')[0] } } | out-file C:\file_shares\$Server.txt
}
3
3
3
2016-05-20 22:20:09 +0000

Grazie a Mark Henderson per la sua soluzione . Ho aggiunto una funzione wrapper per aiutare a rendere questa chiamata di funzione più amichevole per PowerShell. Ho usato un approccio diverso per suddividere i dati (più complesso, non migliore); che può essere facilmente cambiato in base alle preferenze.

clear-host
function Get-SharedFolder {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string]$ComputerName 
        ,
        [Parameter(Mandatory = $false)]
        [switch]$GetItem
        ,
        [Parameter(Mandatory = $false)]
        [string[]]$ColumnHeadings = @('Share name','Type','Used as','Comment') #I suspect these differ depending on OS language? Therefore made customisable
        ,
        [Parameter(Mandatory = $false)]
        [string]$ShareName = 'Share name' #tell us which of the properties relates to the share name
        #,
        #[Parameter(Mandatory = $false)]
        #[string[]]$Types = @('Disk') # again, likely differs with language. Also there may be other types to include?
    )
    begin {
        [psobject[]]$Splitter = $ColumnHeadings | %{
            $ColumnHeading = $_
            $obj = new-object -TypeName PSObject -Property @{
                Name = $ColumnHeading
                StartIndex = 0
                Length = 0
            }
            $obj | Add-Member -Name Initialise -MemberType ScriptMethod {
                param([string]$header)
                process {
                    $_.StartIndex = $header.indexOf($_.Name)
                    $_.Length = ($header -replace ".*($($_.Name)\s*).*",'$1').Length
                }
            }
            $obj | Add-Member -Name GetValue -MemberType ScriptMethod {
                param([string]$line)
                process {
                    $line -replace ".{$($_.StartIndex)}(.{$($_.Length)}).*",'$1'
                }
            }
            $obj | Add-Member -Name Process -MemberType ScriptMethod {
                param([psobject]$obj,[string]$line)
                process {
                    $obj | Add-Member -Name $_.Name -MemberType NoteProperty -Value ($_.GetValue($line))
                }
            }
            $obj
        }
    }
    process {
        [string[]]$output = (NET.EXE VIEW $ComputerName)
        [string]$headers = $output[4] #find the data's heading row
        $output = $output[7..($output.Length-3)] #keep only the data rows
        $Splitter | %{$_.Initialise($headers)}
        foreach($line in $output) { 
            [psobject]$result = new-object -TypeName PSObject -Property @{ComputerName=$ComputerName;}
            $Splitter | %{$_.Process($result,$line)}
            $result | Add-Member '_ShareNameColumnName' -MemberType NoteProperty -Value $ShareName
            $result | Add-Member 'Path' -MemberType ScriptProperty -Value {("\{0}\{1}" -f $this.ComputerName,$this."$($this._ShareNameColumnName)")}
            $result | Add-Member 'Item' -MemberType ScriptProperty -Value {Get-Item ($this.Path)}
            $result | Add-Member -MemberType MemberSet -Name PSStandardMembers -Value ([System.Management.Automation.PSMemberInfo[]]@(New-Object System.Management.Automation.PSPropertySet(‘DefaultDisplayPropertySet’,[string[]](@('ComputerName','Path') + $ColumnHeadings))))
            $result
        }
    }
}

[string[]]$myServers = 'myServer1','myServer2' #amend this line to get the servers you're interested in
[psobject[]]$shares = $myServers | Get-SharedFolder
write-host 'List of Shares' -ForegroundColor Cyan
$shares | ft -AutoSize
write-host 'Shares as Get-Item output' -ForegroundColor Cyan
$shares | select -expand Item
1
1
1
2018-09-27 20:40:01 +0000

Su Windows 8 o superiore e Windows Server 2012 o superiore, potete usare Get-SmbShare dal modulo SmbShare.

0
0
0
2019-04-08 20:22:36 +0000

Ecco un one liner di PowerShell che usa net view per enumerare tutte le condivisioni remote che un utente può vedere - non significa che abbia accesso.

net view | Where {$_ -like "\*"} | %{$comp = $_.Split(" ")[0]; net view $comp | Where {$_ -like "*Disk*"} | %{$share = $_.Split(" ")[0]; $fullpath = Join-Path $comp $share; $fullpath}}

Se volete vedere se hanno (almeno) accesso in lettura, potete eseguire:

Net view | Where {$_ -like "\*"} | %{$comp = $_.Split(" ")[0]; net view $comp | Where {$_ -like "*Disk*"} | %{$share = $_.Split(" ")[0]; $fullpath = Join-Path $comp $share; [PSCustomObject]@{Path=$fullpath;HasAccess=$(Test-Path $fullpath -ErrorAction SilentlyContinue)}}}

Se avete bisogno di salvare l'output potete sempre convogliarlo in Export-CSV lanciando il seguente dopo l'ultima parentesi:

| Export-CSV "\path\to\file.csv" -NoTypeInformation

Il tutto non è perfetto quando net view lancia un errore ma l'ho scritto basandomi sui commenti qui e funziona abbastanza bene ed è utile per quello di cui ho bisogno quindi ho pensato di condividerlo :)

0
0
0
2015-04-10 17:14:25 +0000

Strumento del kit di risorse di Windows: rmtshare .

Esegui sotto id con i permessi di amministratore sul server remoto o fai una connessione ipc$ al server remoto.

rmtshare \servername