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

PowerShell Liste der freigegebenen Ordner abrufen

Ich versuche, eine Liste von Ordnern zu erhalten, die auf einer Dateifreigabe freigegeben sind. Im Moment habe ich zwei Testordner:

\MYPC\Test1

\MYPC\Test2

Das 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 Pfad nicht finden”. Ich kann sehen, Beispiele, wie dies für \Server\Share als das Verzeichnis zu tun, aber ist es möglich, nur die \Server suchen?

Antworten (8)

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

Versuchen Sie dies:

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

Ref: List Shares in Windows w/ PowerShell _

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

Es gibt nur eine mir bekannte Möglichkeit, Freigaben von der Kommandozeile aus aufzuzählen, 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.

Das ist für sich genommen nicht besonders gut zu parsen, 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 beginnend bei $sharedFolders[7] haben Sie Ihre Freigaben. Sie könnten dann split auf so etwas wie ein doppeltes Leerzeichen setzen - es ist unwahrscheinlich, dass es in einem Anteilsnamen selbst vorkommt, und sollte funktionieren, es sei denn, Ihr Anteilsname ist sehr lang und lässt nur ein einzelnes Leerzeichen zwischen dem Anteilsnamen und dem Typfeld:

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

Sie könnten diese mit einem ForEach und etwas bedingter Logik verarbeiten. Es wäre nicht perfekt, aber es sollte für die meisten Anwendungsfälle funktionieren.

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

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

Wenn Sie die Freigaben des lokalen Rechners finden möchten, können Sie einfach Get-SmbShare ausführen:

> 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

Erweiternd zu Mark Hendersons Antwort :

$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

Vielen Dank an Mark Henderson für seine Lösung . Ich habe eine Wrapper-Funktion hinzugefügt, um diesen Funktionsaufruf PowerShell-freundlicher zu machen. Ich habe einen anderen Ansatz für die Aufteilung der Daten verwendet (komplexer, nicht besser), der je nach Vorliebe einfach umgeschaltet werden kann.

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

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

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

Hier ist ein PowerShell-Einzeiler, der net view verwendet, um alle Remotefreigaben aufzuzählen, die ein Benutzer sehen kann - was nicht bedeutet, 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 (zumindest) 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 Sie die Ausgabe gespeichert haben wollen, können Sie sie immer an Export-CSV weiterleiten, indem Sie das Folgende nach der letzten Klammer einfügen:

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

Das Ganze ist nicht perfekt, wenn net view einen Fehler wirft, aber ich habe es aufgrund der Kommentare hier geschrieben und es funktioniert ziemlich gut und ist hilfreich für das, was ich brauche, also dachte ich, ich teile es :)

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

Windows Resource Kit Werkzeug: rmtshare .

Entweder unter id mit Administratorrechten auf dem Remote-Server ausführen oder eine ipc$-Verbindung zum Remote-Server herstellen.

rmtshare \servername