PowerShell Ottieni l'elenco delle cartelle condivise


19

Sto cercando di ottenere un elenco di cartelle condivise su una condivisione 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 viene fuori con "impossibile trovare il percorso". Vedo esempi di come eseguire questa operazione \\Server\Sharecome directory, ma è possibile solo cercare \\Server?

Risposte:


24

Prova questo:

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

Rif: elenca le condivisioni in Windows con PowerShell


5
Ciò richiederebbe i diritti WMI sul computer di destinazione, che non è una soluzione particolarmente portatile.
Mark Henderson,

3
inoltre, richiederebbe comunicazioni RPC, che potrebbero essere protette da firewall in molte configurazioni anche laddove sia consentito lo SMB generico. Certo, net viewnon restituirebbe condivisioni nascoste.
syneticon-dj,

14

C'è solo un modo per enumerare le condivisioni in remoto dalla riga 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 è possibile inserirlo in un array per elaborare i dati riga per riga:

$sharedFolders = (NET.EXE VIEW \\enetsqnap01) 

Ora hai un array e a partire da $sharedFolders[7]hai le tue condivisioni. Potresti quindi utilizzare splitqualcosa come un doppio spazio - è improbabile che appaia in un nome di condivisione stesso e dovrebbe funzionare a meno che il tuo nome di condivisione non sia molto lungo, lasciando solo un singolo spazio tra il nome della condivisione e il campo del tipo:

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

È possibile elaborarli utilizzando un ForEach e una logica condizionale. Non sarebbe perfetto, ma dovrebbe funzionare per la maggior parte dei casi d'uso.

Per brevità, per generare semplicemente i nomi dei file sulla console:

(net view \\enetsqnap01) | % { if($_.IndexOf(' Disk ') -gt 0){ $_.Split('  ')[0] } }

Cordiali saluti: Ho aggiunto una funzione di aiuto per concludere la chiamata e abbattere l'output del testo in modo semi-intelligente ... speriamo che abbia senso / aiuti alcune persone là fuori.
JohnLBevan,

1
@JohnLBevan Non lo vedo qui. Forse la modifica è stata respinta? Se lo invii nuovamente, vedrò se posso esaminarlo in tempo prima che qualcun altro lo raggiunga.
Mark Henderson

Grazie @Mark Henderson. Dalle note della recensione ( superuser.com/review/suggested-edits/535793 ) sembra che la gente preferirebbe che io inserissi il mio codice in una risposta separata, quindi ho pubblicato qui: superuser.com/a/1079174/156700 . Spero che questo sia utile per gli altri. Grazie ancora per la tua soluzione.
JohnLBevan,

8

Se vuoi trovare le condivisioni del computer locale, puoi semplicemente fare Get-SmbShare:

> Get-SmbShare

Name                          ScopeName                     Path                          Description
----                          ---------                     ----                          -----------
ADMIN$                        *                             C:\WINDOWS                    Remote Admin
C$                            *                             C:\                           Default share

3

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
}

2
Puoi spiegare cosa fanno le tue espansioni?
bertieb,

3

Grazie a Mark Henderson per la sua soluzione . Ho aggiunto una funzione wrapper per rendere questa funzione più adatta a 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

Su Windows 8 o versioni successive e Windows Server 2012 o versioni successive, è possibile utilizzare Get-SmbShare dal modulo SmbShare.


0

Strumento Resource Kit di Windows: rmtshare .

Eseguire in id con autorizzazioni di amministratore sul server remoto o stabilire una connessione ipc $ al server remoto.

rmtshare \\servername

Puoi espandere la tua risposta un po 'di più per includere i passaggi necessari per risolvere il problema?
Cfinley,

0

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

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

Se vuoi vedere se hanno (almeno) l'accesso in lettura, puoi 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 è necessario salvare l'output, è sempre possibile reindirizzarlo a Export-CSV attivando quanto segue dopo l'ultima parentesi:

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

Il tutto non è perfetto quando net view genera un errore, ma l'ho scritto sulla base dei commenti qui e funziona abbastanza bene ed è utile per ciò di cui ho bisogno, quindi ho pensato di condividere. :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.