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 w / PowerShell


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

FYI: Я додав допоміжну функцію, щоб завершити виклик і розбити текстовий вихід напівінтелектуальним способом ... сподіваюся, це має сенс / допомагає деяким людям там.
JohnLBevan

1
@JohnLBevan Я тут цього не бачу. Можливо, редакцію відхилено? Якщо ви знову надішлете його, я побачу, чи зможу я його переглянути вчасно, перш ніж хтось до нього потрапить.
Марк Хендерсон

Дякуємо @Mark Henderson З оглядових приміток ( superuser.com/review/sugges-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
}

2
Чи можете ви пояснити, що роблять ваші розширення?
bertieb

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

1

У Windows 8 або новіших версіях та Windows Server 2012 або новіших версіях ви можете використовувати Get-SmbShare з модуля SmbShare.


0

Інструмент Windows Resource Kit: rmtshare .

Або запустіть під id з дозволом адміністратора на віддаленому сервері або зробіть ipc $ з'єднання з віддаленим сервером.

rmtshare \\servername

Чи можете ви розширити свою відповідь трохи більше, щоб включити кроки, необхідні для вирішення проблеми?
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

Вся справа не є ідеальною, коли чистий вигляд призводить до помилок, але я написав це, грунтуючись на коментарях тут, і він працює досить добре і корисний для того, що мені потрібно, тому я подумав, що поділюсь. :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.