PowerShell Liste der freigegebenen Ordner abrufen

90490
The Woo

Ich versuche, eine Liste der Ordner zu erhalten, die für eine 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 sehe Beispiele dafür, wie dies \\Server\Shareals Verzeichnis zu tun ist, aber ist es möglich, das nur zu durchsuchen \\Server?

13

7 Antworten auf die Frage

20
Tamerz

Versuche dies:

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

Referenz: Auflisten von Freigaben in Windows mit PowerShell

Dies würde WMI-Rechte auf dem Zielcomputer erfordern, was keine besonders tragbare Lösung ist. Mark Henderson vor 10 Jahren 4
Darüber hinaus würde RPC-Kommunikation erforderlich sein, die in vielen Konfigurationen wahrscheinlich durch Firewall geschützt wird, selbst wenn generisches SMB zulässig ist. Zugegeben, "net view" würde keine versteckten Aktien zurückgeben. syneticon-dj vor 10 Jahren 2
11
Mark Henderson

Es gibt nur eine Möglichkeit, Freigaben von der Befehlszeile aus aufzurufen, die ich kenne, und das ist mit 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 nicht besonders parsbar für sich allein, aber Sie können es in ein Array werfen, um die Daten Zeile für Zeile zu verarbeiten:

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

Sie haben jetzt ein Array und haben ab sofort $sharedFolders[7]Ihre Freigaben. Sie könnten dann splitauf einem doppelten Leerzeichen stehen - unwahrscheinlich, dass es in einem Freigabenamen selbst angezeigt wird, und es sollte funktionieren, wenn Ihr Freigabename nicht sehr lang ist und nur ein Leerzeichen zwischen dem Freigabenamen und dem Typfeld übrig lässt:

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

Sie können diese mit Hilfe von ForEach und einer bedingten Logik verarbeiten. Es wäre nicht perfekt, aber es sollte für die meisten Anwendungsfälle funktionieren.

Der Einfachheit halber, um die Dateinamen einfach auf der Konsole auszugeben:

(net view \\enetsqnap01) | % { if($_.IndexOf(' Disk ') -gt 0){ $_.Split(' ')[0] } } 
Zu Ihrer Information: Ich habe eine Hilfsfunktion hinzugefügt, um den Anruf abzuschließen und die Textausgabe auf halbintelligente Weise aufzuschlüsseln ... hoffentlich macht es Sinn / hilft einigen Leuten da draußen. JohnLBevan vor 8 Jahren 0
@ JohnLBevan Ich sehe es hier nicht. Vielleicht wurde die Bearbeitung abgelehnt? Wenn Sie es erneut einreichen, werde ich sehen, ob ich es noch rechtzeitig überprüfen kann, bevor es jemand anders macht. Mark Henderson vor 8 Jahren 1
Vielen Dank @ Mark Henderson. Aus den Übersichtsnotizen (http://superuser.com/review/suggested-edits/535793) scheint es, als würden die Leute es vorziehen, dass ich meinen Code in einer separaten Antwort posten würde. Daher habe ich hier http://superuser.com gepostet / a / 1079174/156700. Hoffe, das ist für andere nützlich. Nochmals vielen Dank für Ihre Lösung. JohnLBevan vor 8 Jahren 0
6
Klas Mellbourn

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
DingoCC

Die Antwort von Mark Henderson erweitern :

$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 } 
Kannst du erklären, was deine Erweiterungen tun? bertieb vor 9 Jahren 2
3
JohnLBevan

Danke an Mark Henderson für seine Lösung . Ich habe eine Wrapper-Funktion hinzugefügt, um den Aufruf dieser Funktion für mehr PowerShell-freundlicher zu gestalten. Ich habe einen anderen Ansatz zum Aufteilen der Daten verwendet (komplexer, nicht besser); das kann je nach Präferenz leicht umgeschaltet 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 @ $Splitter | %{$_.Process($result,$line)} $result | Add-Member '_ShareNameColumnName' -MemberType NoteProperty -Value $ShareName $result | Add-Member 'Path' -MemberType ScriptProperty -Value {("\\\" -f $this.ComputerName,$this."$($this._ShareNameColumnName)")} $result | Add-Member 'Item' -MemberType ScriptProperty -Value  $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 
0
Windows Admin

Windows Resource Kit-Tool: rmtshare .

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

rmtshare \\servername 
Können Sie Ihre Antwort noch ein wenig erweitern, um die Schritte zur Lösung des Problems einzubeziehen? Cfinley vor 9 Jahren 0
0
JamieSee

Unter Windows 8 oder höher und Windows Server 2012 oder höher können Sie Get-SmbShare vom SmbShare-Modul aus verwenden.