PowerShell Получить список общих папок

90386
The Woo

Я пытаюсь получить список папок, к которым открыт общий доступ к общей папке. На данный момент у меня есть две тестовые папки:

\\MYPC\Test1  \\MYPC\Test2 

Вот код, который у меня есть на данный момент:

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

Но это приходит с "не может найти путь". Я могу видеть примеры того, как сделать это в \\Server\Shareкачестве каталога, но можно ли просто искать \\Server?

13

7 ответов на вопрос

20
Tamerz

Try this:

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

Ref: List Shares in Windows w/ PowerShell

Для этого потребуются права WMI на конечном компьютере, что не является особенно переносимым решением. Mark Henderson 9 лет назад 4
Кроме того, для этого потребуется связь RPC, которая, вероятно, будет защищена брандмауэром во многих конфигурациях, даже если разрешен общий SMB. Следует признать, что `net view` не вернул бы скрытые акции. syneticon-dj 9 лет назад 2
11
Mark Henderson

There's only one way of enumerating shares remotely from the command line that I know of, and thats with 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. 

This is not particularly parsable on its own, but, you can throw it into an array to process the data line by line:

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

You now have an array, and starting at $sharedFolders[7] you have your shares. You could then split on something like a double space - unlikely to appear in a share name itself, and should work unless your share name is very long, only leaving a single space between the share name and the type field:

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

You could process these by using a ForEach and some conditional logic. It wouldn't be perfect, but it should work for most use cases.

For brevity, to just output the filenames to the console:

(net view \\enetsqnap01) | % { if($_.IndexOf(' Disk ') -gt 0){ $_.Split(' ')[0] } } 
К вашему сведению: я добавил вспомогательную функцию, чтобы завершить вызов и разбить вывод текста полуинтеллектуальным способом ... надеюсь, это имеет смысл / помогает некоторым людям там. JohnLBevan 7 лет назад 0
@JohnLBevan Я не вижу здесь этого. Может быть, редактирование было отклонено? Если вы отправите его еще раз, я посмотрю, смогу ли я просмотреть его вовремя, прежде чем кто-то еще доберется до него. Mark Henderson 7 лет назад 1
Спасибо @ Марк Хендерсон. Из примечаний к обзору (http://superuser.com/review/suggested-edits/535793) кажется, что люди предпочли бы, чтобы я разместил мой код в отдельном ответе, поэтому я разместил здесь: http://superuser.com / а / 1079174/156700. Надеюсь, что это полезно для других. Еще раз спасибо за ваше решение. JohnLBevan 7 лет назад 0
6
Klas Mellbourn

Если вы хотите найти акции локального компьютера, вы можете просто сделать Get-SmbShare:

> Get-SmbShare  Name ScopeName Path Description ---- --------- ---- ----------- ADMIN$ * C:\WINDOWS Remote Admin C$ * C:\ Default share 
3
DingoCC

Expanding on Mark Henderson's answer:

$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 } 
Можете ли вы объяснить, что делают ваши расширения? bertieb 8 лет назад 2
3
JohnLBevan

Спасибо Марку Хендерсону за его решение . Я добавил функцию-обертку, чтобы сделать этот вызов более дружественным к PowerShell. Я использовал другой подход к разбивке данных (более сложный, а не лучший); это может быть легко переключено на основе предпочтений.

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.

Either run under id with administrator permissions on the remote server or make an ipc$ connection to remote server.

rmtshare \\servername 
Можете ли вы расширить свой ответ немного больше, чтобы включить шаги, необходимые для решения проблемы? Cfinley 9 лет назад 0
0
JamieSee

На Windows 8 или выше и Windows Server 2012 или выше вы можете использовать Get-SmbShare из модуля SmbShare.