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

PowerShell Pobierz listę folderów współdzielonych

Próbuję uzyskać listę folderów, które są współdzielone na udziale plików. W tej chwili mam dwa foldery testowe:

\MYPC\Test1

\MYPC\Test2

To jest kod, który mam w tej chwili:

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

Write-Host $FolderList

Ale to wyskakuje z “nie można znaleźć ścieżki”. Widzę przykłady, jak to zrobić dla \Server\Share jako katalogu, ale czy jest możliwe, aby po prostu przeszukać \Server?

Odpowiedzi (8)

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

Spróbuj tego:

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

Jest tylko jeden sposób na wyliczanie udziałów zdalnie z linii poleceń, jaki znam, i jest to 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.

To nie jest szczególnie parsowalne samo w sobie, ale, możesz wrzucić to do tablicy, aby przetwarzać dane linia po linii:

$sharedFolders = (NET.EXE VIEW \enetsqnap01)

Masz teraz tablicę, i zaczynając od $sharedFolders[7] masz swoje udziały. Mógłbyś wtedy split na czymś takim jak podwójna spacja - mało prawdopodobne, że pojawi się w samej nazwie akcji, i powinno działać, chyba że twoja nazwa akcji jest bardzo długa, pozostawiając tylko pojedynczą spację pomiędzy nazwą akcji a polem typu:

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

Mógłbyś przetworzyć te dane używając ForEach i trochę logiki warunkowej. Nie byłoby to idealne rozwiązanie, ale powinno działać dla większości przypadków użycia.

Dla zwięzłości, aby po prostu wypisać nazwy plików na konsolę:

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

Jeśli chcesz znaleźć udziały lokalnej maszyny, możesz po prostu zrobić 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

Rozszerzając odpowiedź Marka Hendersona ](https://superuser.com/a/769694/461558):

$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

Podziękowania dla Marka Hendersona za jego rozwiązanie . Dodałem funkcję wrappera, aby pomóc uczynić to wywołanie funkcji bardziej przyjaznym dla PowerShell. Użyłem innego podejścia do rozbijania danych (bardziej złożonego, nie lepszego); które można łatwo zamienić w oparciu o preferencje.

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

W Windows 8 lub nowszym i Windows Server 2012 lub nowszym, można użyć Get-SmbShare z modułu SmbShare.

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

Oto one liner PowerShella, który używa net view do wyliczenia wszystkich zdalnych udziałów, które użytkownik może zobaczyć - nie oznacza to, że ma do nich dostęp.

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

Jeśli chcesz sprawdzić, czy mają (przynajmniej) dostęp do odczytu, możesz uruchomić:

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

Jeśli potrzebujesz zapisanego wyjścia, zawsze możesz je pipe'ować do Export-CSV, wrzucając po ostatnim nawiasie poniższe:

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

Całość nie jest idealna, gdy net view wyrzuca błąd, ale napisałem ją w oparciu o komentarze tutaj i działa całkiem dobrze i jest pomocna do tego, czego potrzebuję, więc pomyślałem, że się podzielę :)

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

Narzędzie Windows Resource Kit: rmtshare .

Albo uruchom pod id z uprawnieniami administratora na zdalnym serwerze lub wykonaj połączenie ipc$ do zdalnego serwera.

rmtshare \servername
```.