PowerShell รับรายการโฟลเดอร์ที่แชร์


17

ฉันพยายามรับรายการโฟลเดอร์ที่แชร์บนการแชร์ไฟล์ ในขณะนี้ฉันมีสองโฟลเดอร์ทดสอบ:

\\MYPC\Test1

\\MYPC\Test2

นี่คือรหัสที่ฉันมีในขณะนี้:

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

Write-Host $FolderList

แต่สิ่งนี้เกิดขึ้นกับ "ไม่พบเส้นทาง" ฉันเห็นตัวอย่างของวิธีการทำเช่นนี้\\Server\Shareเป็นไดเรกทอรี แต่เป็นไปได้\\Serverหรือไม่ที่จะค้นหา?

คำตอบ:


22

ลองสิ่งนี้:

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

Ref: แสดงรายการการแบ่งปันใน Windows ด้วย PowerShell


4
สิ่งนี้จะต้องใช้สิทธิ์ WMI บนเครื่องปลายทางซึ่งไม่ใช่โซลูชันแบบพกพาโดยเฉพาะ
มาร์คเฮนเดอร์สัน

2
นอกจากนี้จะต้องมีการสื่อสาร 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

ขอบคุณ @ Mark Henderson จากบันทึกการตรวจสอบ ( superuser.com/review/suggested-edits/535793 ) ดูเหมือนว่าคนจะชอบผมที่จะโพสต์รหัสของฉันในคำตอบที่แยกต่างหากเพื่อให้ฉันได้โพสต์ที่นี่: superuser.com/a/1079174/156700 หวังว่านี่จะเป็นประโยชน์กับคนอื่น ๆ ขอบคุณอีกครั้งสำหรับวิธีแก้ปัญหาของคุณ
JohnLBevan

7

หากคุณต้องการค้นหาการแชร์ของเครื่องโลคอลคุณสามารถทำได้Get-SmbShare:

> Get-SmbShare

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

3

ขยายคำตอบของ 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
คุณช่วยอธิบายว่าการขยายตัวของคุณทำอะไรได้บ้าง?
bertieb

3

ขอขอบคุณที่มาร์คเฮนเดอสำหรับการแก้ปัญหาของเขา ฉันได้เพิ่มฟังก์ชัน wrapper เพื่อช่วยให้ฟังก์ชันนี้เรียกใช้ 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

0

ทรัพยากร Windows เครื่องมือ 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

สิ่งทั้งหมดนั้นไม่สมบูรณ์แบบเมื่อเน็ตวิวโยนข้อผิดพลาด แต่ฉันเขียนมันตามความคิดเห็นที่นี่และมันใช้งานได้ดีและมีประโยชน์สำหรับสิ่งที่ฉันต้องการดังนั้นฉันจึงคิดว่าฉันจะแบ่งปัน :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.