PowerShell Dapatkan Daftar Folder yang Dibagikan


19

Saya mencoba untuk mendapatkan daftar folder yang dibagikan pada file yang dibagikan. Saat ini saya memiliki dua folder tes:

\\MYPC\Test1

\\MYPC\Test2

Ini adalah kode yang saya miliki saat ini:

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

Write-Host $FolderList

Tetapi ini muncul dengan "tidak dapat menemukan jalan". Saya dapat melihat contoh bagaimana melakukan ini \\Server\Sharesebagai direktori, tetapi apakah mungkin untuk hanya mencari \\Server?

Jawaban:


24

Coba ini:

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

Ref: Daftar Saham di Windows dengan PowerShell


5
Ini akan membutuhkan hak WMI pada mesin tujuan, yang bukan merupakan solusi portabel.
Mark Henderson

3
ditambah lagi, itu akan membutuhkan komunikasi RPC, yang kemungkinan besar akan firewall di banyak konfigurasi bahkan di mana SMB generik diizinkan. Harus diakui, net viewtidak akan mengembalikan saham yang disembunyikan.
syneticon-dj

14

Hanya ada satu cara untuk menghitung bagian dari jarak jauh dari baris perintah yang saya tahu, dan itu dengan 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.

Ini tidak bisa diurai sendiri, tetapi, Anda bisa membuangnya ke dalam array untuk memproses data baris demi baris:

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

Anda sekarang memiliki array, dan mulai $sharedFolders[7]Anda memiliki saham Anda. Anda kemudian bisa splitpada sesuatu seperti spasi ganda - tidak mungkin muncul dalam nama share itu sendiri, dan harus berfungsi kecuali nama share Anda sangat panjang, hanya menyisakan satu spasi antara nama share dan bidang tipe:

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

Anda bisa memproses ini dengan menggunakan ForEach dan beberapa logika kondisional. Itu tidak akan sempurna, tetapi harus bekerja untuk sebagian besar kasus penggunaan.

Untuk singkatnya, untuk hanya menampilkan nama file ke konsol:

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

FYI: Saya menambahkan fungsi pembantu untuk menyelesaikan panggilan dan memecah output teks dengan cara semi-cerdas ... semoga masuk akal / membantu beberapa orang di luar sana.
JohnLBevan

1
@ JohnLBevan Saya tidak melihatnya di sini. Mungkin hasil edit ditolak? Jika Anda mengirimkannya lagi saya akan melihat apakah saya dapat memeriksanya tepat waktu sebelum orang lain mendapatkannya.
Mark Henderson

Terima kasih @ Mark Henderson. Dari catatan ulasan ( superuser.com/review/suggested-edits/535793 ) tampaknya orang lebih suka saya untuk mengirim kode saya dalam jawaban yang terpisah, jadi saya memposting di sini: superuser.com/a/1079174/156700 . Semoga ini bermanfaat bagi orang lain. Sekali lagi terima kasih atas solusinya.
JohnLBevan

8

Jika Anda ingin menemukan bagian dari mesin lokal, Anda cukup melakukannya Get-SmbShare:

> Get-SmbShare

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

3

Memperluas jawaban 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
Bisakah Anda menjelaskan apa yang dilakukan ekspansi Anda?
bertieb

3

Terima kasih kepada Mark Henderson atas solusinya . Saya telah menambahkan fungsi wrapper untuk membantu menjadikan fungsi ini lebih ramah dengan PowerShell. Saya telah menggunakan pendekatan berbeda untuk memecah data (lebih kompleks, tidak lebih baik); yang dapat dengan mudah diubah berdasarkan preferensi.

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

Pada Windows 8 atau lebih tinggi dan Windows Server 2012 atau lebih tinggi, Anda dapat menggunakan Get-SmbShare dari modul SmbShare.


0

Alat Windows Resource Kit: rmtshare .

Jalankan di bawah id dengan izin administrator di server jarak jauh atau buat koneksi ipc $ ke server jarak jauh.

rmtshare \\servername

Bisakah Anda memperluas jawaban Anda sedikit lebih banyak dengan memasukkan langkah-langkah yang diperlukan untuk menyelesaikan masalah?
Cfinley

0

Berikut ini adalah PowerShell one liner yang menggunakan tampilan bersih untuk menghitung semua bagian jauh yang dapat dilihat pengguna - tidak berarti mereka memiliki akses.

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

Jika Anda ingin melihat apakah mereka memiliki (setidaknya) akses baca, Anda dapat menjalankan:

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

Jika Anda membutuhkan output yang disimpan, Anda selalu dapat mengirimkannya ke Export-CSV dengan melemparkan yang berikut ini setelah braket terakhir:

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

Semuanya tidak sempurna ketika tampilan bersih melempar kesalahan tapi saya menulisnya berdasarkan komentar di sini dan itu bekerja dengan sangat baik dan sangat membantu untuk apa yang saya butuhkan jadi saya pikir saya akan berbagi. :)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.