PowerShell Paylaşılan Klasörlerin Listesini Al


19

Bir dosya paylaşımında paylaşılan klasörlerin bir listesini almaya çalışıyorum. Şu anda iki test klasörüm var:

\\MYPC\Test1

\\MYPC\Test2

Bu şu anda sahip olduğum kod:

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

Write-Host $FolderList

Ama bu "yolu bulamıyor" ile ortaya çıkıyor. Bunun \\Server\Sharedizin olarak nasıl yapılacağını örnekleri görebilirsiniz , ancak sadece aramak mümkün \\Servermü?

Yanıtlar:


24

Bunu dene:

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

Ref: PowerShell ile Windows'ta Paylaşım Listeleri


5
Bu, özellikle taşınabilir bir çözüm olmayan hedef makinede WMI hakları gerektirir.
Mark Henderson

3
ayrıca, genel SMB'ye izin verildiğinde bile birçok yapılandırmada güvenlik duvarı oluşturması muhtemel RPC iletişimlerini gerektirir. Kuşkusuz, net viewgizli paylaşımları iade etmeyecekti.
syneticon-dj

14

Bildiğim komut satırından paylaşımları uzaktan numaralandırmanın tek bir yolu var ve şu şekilde 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.

Bu özellikle kendi başına ayrıştırılamaz, ancak veriyi satır satır işlemek için bir diziye atabilirsiniz:

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

Artık bir diziniz var ve başlangıçta $sharedFolders[7]paylaşımlarınız var. Daha sonra splitçift ​​alan gibi bir şeyde olabilirsiniz - paylaşım adının kendisinde görünme olasılığı düşüktür ve paylaşım adınız çok uzun değilse, paylaşım adı ve tür alanı arasında tek bir boşluk bırakarak çalışmanız gerekir:

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

Bunları bir ForEach ve bazı koşullu mantık kullanarak işleyebilirsiniz. Mükemmel olmaz, ancak çoğu kullanım durumunda işe yaramalıdır.

Kısacası, sadece dosya adlarını konsola çıkarmak için:

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

Bilginize: Aramayı tamamlamak ve metin çıktısını yarı akıllı bir şekilde parçalamak için bir yardımcı işlev ekledim ... umarım bazı insanlara mantıklı / yardım eder.
JohnLBevan

1
@JohnLBevan Burada görmüyorum. Belki düzenleme reddedildi? Tekrar gönderirseniz, başkasına ulaşmadan önce zamanında gözden geçirip geçiremeyeceğimi göreceğim.
Mark Henderson

Teşekkürler @ Mark Henderson. İnceleme notlarından ( superuser.com/review/suggested-edits/535793 ), insanlar kodumu ayrı bir cevapta göndermemi tercih ederler, bu yüzden burada yayınladım: superuser.com/a/1079174/156700 . Umarım bu başkaları için yararlıdır. Çözümünüz için tekrar teşekkürler.
JohnLBevan

8

Yerel makinenin hisselerini bulmak istiyorsanız şunları yapabilirsiniz Get-SmbShare:

> Get-SmbShare

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

3

Mark Henderson'ın cevabına genişleyen :

$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
Genişlemelerinizin ne yaptığını açıklayabilir misiniz?
bertieb

3

Mark Henderson'a çözümü için teşekkürler . Bu işlevin daha fazla PowerShell dostu olmasını sağlamak için bir sarıcı işlevi ekledim. Verileri ayırmak için farklı bir yaklaşım kullandım (daha karmaşık, daha iyi değil); tercihe göre kolayca değiştirilebilir.

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 veya üzeri ve Windows Server 2012 veya üzeri sürümlerde, SmbShare modülünden Get-SmbShare kullanabilirsiniz .


0

Windows Kaynak Seti aracı: rmtshare .

Uzak sunucudaki yönetici izinleriyle kimlik altında çalıştırın veya uzak sunucuya bir ipc $ bağlantısı yapın.

rmtshare \\servername

Sorunu çözmek için gereken adımları içerecek şekilde cevabınızı biraz daha genişletebilir misiniz?
Cfinley

0

İşte bir kullanıcının görebildiği tüm uzak paylaşımları numaralandırmak için net görünümü kullanan bir PowerShell tek astarı - erişime sahip oldukları anlamına gelmez.

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

(En azından) okuma erişimine sahip olup olmadıklarını görmek istiyorsanız, şunları çalıştırabilirsiniz:

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

Kaydedilen çıkışa ihtiyacınız varsa, son braketten sonra aşağıdakileri atarak her zaman Export-CSV'ye bağlayabilirsiniz:

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

Net görünüm bir hata atar zaman her şey mükemmel değil ama ben burada yorumları dayanarak yazdı ve oldukça iyi çalışıyor ve ben paylaşmak düşündüm bu yüzden ihtiyacım olan şey için yararlıdır. :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.