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

19

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

\\MYPC\Test1

\\MYPC\Test2

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

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

Write-Host $FolderList

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

Ву
источник

Ответы:

24

Попробуй это:

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

Ссылка: список общих ресурсов в Windows с PowerShell

Tamerz
источник
5
Для этого потребуются права WMI на конечном компьютере, что не является особенно переносимым решением.
Марк Хендерсон
3
Кроме того, для этого потребуется связь RPC, которая, вероятно, будет защищена брандмауэром во многих конфигурациях, даже если разрешен общий SMB. Правда, net viewне вернул бы скрытые акции.
syneticon-dj
14

Есть только один способ удаленного перечисления общих ресурсов из командной строки, о котором я знаю, а именно 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.

Сам по себе это не особо разбирается, но вы можете выбросить его в массив для построчной обработки данных:

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

Теперь у вас есть массив, и у $sharedFolders[7]вас есть свои акции. Затем вы можете использовать splitчто-то вроде двойного пробела - вряд ли он появится в самом имени общего ресурса и должен работать, если имя общего ресурса не очень длинное, оставляя только один пробел между именем общего ресурса и полем типа:

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

Вы можете обработать их, используя ForEach и некоторую условную логику. Это не было бы идеально, но это должно работать для большинства случаев использования.

Для краткости просто выведем имена файлов на консоль:

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

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

> Get-SmbShare

Name                          ScopeName                     Path                          Description
----                          ---------                     ----                          -----------
ADMIN$                        *                             C:\WINDOWS                    Remote Admin
C$                            *                             C:\                           Default share
Клас Меллборн
источник
3

Расширяя ответ Марка Хендерсона :

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

Спасибо Марку Хендерсону за его решение . Я добавил функцию-обертку, чтобы сделать эту функцию более дружественной к 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 @{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
JohnLBevan
источник
1

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

JamieSee
источник
0

Средство Windows Resource Kit: rmtshare .

Либо запустите под идентификатором с правами администратора на удаленном сервере, либо установите соединение ipc $ с удаленным сервером.

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

Вот один вкладыш PowerShell, который использует сетевое представление для перечисления всех удаленных общих ресурсов, которые может видеть пользователь - это не значит, что у них есть доступ.

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

Если вы хотите увидеть, имеют ли они (по крайней мере) доступ на чтение, вы можете запустить:

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

Если вам нужен сохраненный вывод, вы всегда можете передать его в Export-CSV, добавив следующее после последней скобки:

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

Все это не идеально, когда net view выдает ошибку, но я написал ее, основываясь на комментариях здесь, и она работает довольно хорошо и полезна для того, что мне нужно, поэтому я решил поделиться. :)

Арен Бадер-Джарвис
источник