PowerShell - Liste der freigegebenen Ordner abrufen


19

Ich versuche, eine Liste der Ordner abzurufen, die auf einer Dateifreigabe freigegeben sind. Im Moment habe ich zwei Testordner:

\\MYPC\Test1

\\MYPC\Test2

Dies ist der Code, den ich im Moment habe:

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

Write-Host $FolderList

Aber das kommt mit "kann den Weg nicht finden". Ich kann Beispiele dafür \\Server\Shareals Verzeichnis sehen, aber ist es möglich, nur das zu durchsuchen \\Server?

Antworten:


24

Versuche dies:

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

Referenz: Auflisten von Freigaben in Windows mit PowerShell


5
Dies würde WMI-Rechte auf dem Zielcomputer erfordern, was keine besonders tragbare Lösung ist.
Mark Henderson

3
Darüber hinaus ist eine RPC-Kommunikation erforderlich, die in vielen Konfigurationen wahrscheinlich auch dann Firewall-geschützt ist, wenn generisches SMB zulässig ist. Zugegeben, net viewwürde keine versteckten Aktien zurückgeben.
syneticon-dj

14

Es gibt nur eine Möglichkeit, Freigaben remote über die mir bekannte Befehlszeile aufzulisten 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.

Dies ist für sich genommen nicht besonders analysierbar, aber Sie können es in ein Array werfen, um die Daten zeilenweise zu verarbeiten:

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

Sie haben jetzt ein Array und ab $sharedFolders[7]haben Sie Ihre Freigaben. Sie könnten dann splitauf so etwas wie ein doppeltes Leerzeichen klicken - es ist unwahrscheinlich, dass es in einem Freigabenamen selbst vorkommt. Es sollte funktionieren, es sei denn, Ihr Freigabename ist sehr lang und es bleibt nur ein Leerzeichen zwischen dem Freigabenamen und dem Typfeld:

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

Sie können diese verarbeiten, indem Sie ForEach und eine bedingte Logik verwenden. Es wäre nicht perfekt, sollte aber für die meisten Anwendungsfälle funktionieren.

Der Kürze halber einfach die Dateinamen auf der Konsole ausgeben:

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

Zu Ihrer Information: Ich habe eine Hilfsfunktion hinzugefügt, um den Anruf zu beenden und die Textausgabe auf halbintelligente Weise aufzuschlüsseln ... hoffentlich macht es Sinn / hilft einigen Leuten da draußen.
JohnLBevan

1
@ JohnLBevan Ich sehe es hier nicht. Vielleicht wurde die Bearbeitung abgelehnt? Wenn Sie es erneut einreichen, werde ich sehen, ob ich es rechtzeitig überprüfen kann, bevor jemand anderes es erreicht.
Mark Henderson

Vielen Dank an Mark Henderson. Aus den Überprüfungsnotizen ( superuser.com/review/suggested-edits/535793 ) geht hervor, dass die Leute es vorziehen würden, meinen Code in einer separaten Antwort zu veröffentlichen. Ich habe dies hier gepostet: superuser.com/a/1079174/156700 . Hoffe, das ist nützlich für andere. Nochmals vielen Dank für Ihre Lösung.
JohnLBevan

8

Wenn Sie die Freigaben des lokalen Computers suchen möchten, können Sie Folgendes tun Get-SmbShare:

> Get-SmbShare

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

3

Auf Mark Hendersons Antwort eingehen :

$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
Können Sie erklären, was Ihre Erweiterungen bewirken?
Bertieb

3

Vielen Dank an Mark Henderson für seine Lösung . Ich habe eine Wrapper-Funktion hinzugefügt, um diesen Funktionsaufruf für PowerShell benutzerfreundlicher zu machen. Ich habe einen anderen Ansatz gewählt, um die Daten aufzuteilen (komplexer, nicht besser). das kann leicht nach Belieben gewechselt werden.

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

Unter Windows 8 oder höher und Windows Server 2012 oder höher können Sie Get-SmbShare über das SmbShare-Modul verwenden.


0

Windows Resource Kit-Tool: rmtshare .

Führen Sie entweder eine ID mit Administratorrechten auf dem Remote-Server aus oder stellen Sie eine IPC $ -Verbindung zum Remote-Server her.

rmtshare \\servername

Können Sie Ihre Antwort ein wenig erweitern, um die Schritte einzuschließen, die zur Lösung des Problems erforderlich sind?
Cfinley

0

Hier ist ein PowerShell One-Liner, der mithilfe der Netzansicht alle Remotefreigaben auflistet, die ein Benutzer sehen kann. Dies bedeutet nicht, dass er Zugriff hat.

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

Wenn Sie sehen möchten, ob sie (mindestens) Lesezugriff haben, können Sie Folgendes ausführen:

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)}}}

Wenn die Ausgabe gespeichert werden soll, können Sie sie jederzeit an Export-CSV weiterleiten, indem Sie nach der letzten Klammer Folgendes aktivieren:

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

Das Ganze ist nicht perfekt, wenn net view einen Fehler auslöst, aber ich habe es basierend auf den Kommentaren hier geschrieben und es funktioniert ziemlich gut und ist hilfreich für das, was ich brauche, also dachte ich, ich würde es teilen. :)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.