PowerShell Nhận danh sách các thư mục được chia sẻ


19

Tôi đang cố gắng để có được một danh sách các thư mục được chia sẻ trên một chia sẻ tập tin. Hiện tại tôi có hai thư mục kiểm tra:

\\MYPC\Test1

\\MYPC\Test2

Đây là mã tôi có tại thời điểm này:

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

Write-Host $FolderList

Nhưng điều này đi kèm với "không thể tìm thấy con đường". Tôi có thể xem các ví dụ về cách làm điều này với \\Server\Sharetư cách là thư mục, nhưng liệu có thể chỉ tìm kiếm \\Serverkhông?

Câu trả lời:


24

Thử đi:

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

Tham chiếu: Danh sách Chia sẻ trong Windows w / PowerShell


5
Điều này sẽ yêu cầu quyền WMI trên máy đích, đây không phải là một giải pháp di động đặc biệt.
Mark Henderson

3
hơn nữa, nó sẽ yêu cầu giao tiếp RPC, có khả năng được tường lửa trong nhiều cấu hình ngay cả khi SMB chung được cho phép. Phải thừa nhận rằng net viewsẽ không trả lại cổ phiếu ẩn.
syirecton-dj

14

Chỉ có một cách liệt kê các chia sẻ từ xa từ dòng lệnh mà tôi biết và đó là 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.

Bản thân nó không đặc biệt có thể phân tích được, nhưng, bạn có thể ném nó vào một mảng để xử lý từng dòng dữ liệu:

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

Bây giờ bạn có một mảng, và bắt đầu từ $sharedFolders[7]bạn có cổ phần của bạn. Sau đó, bạn có thể splittrên một cái gì đó như một không gian kép - không thể xuất hiện trong tên chia sẻ và sẽ hoạt động trừ khi tên chia sẻ của bạn rất dài, chỉ để lại một khoảng trắng giữa tên chia sẻ và trường loại:

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

Bạn có thể xử lý chúng bằng cách sử dụng ForEach và một số logic có điều kiện. Nó sẽ không hoàn hảo, nhưng nó sẽ hoạt động trong hầu hết các trường hợp sử dụng.

Để đơn giản, chỉ cần xuất tên tệp vào bảng điều khiển:

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

FYI: Tôi đã thêm một chức năng trợ giúp để kết thúc cuộc gọi và phá vỡ đầu ra văn bản theo cách bán thông minh ... hy vọng nó có ý nghĩa / giúp một số người ngoài đó.
JohnLBevan

1
@JohnLBevan Tôi không thấy nó ở đây. Có lẽ bản chỉnh sửa đã bị từ chối? Nếu bạn gửi lại lần nữa, tôi sẽ xem liệu tôi có thể xem lại kịp thời hay không trước khi có người khác nhận được.
Mark Henderson

Cảm ơn @Mark Henderson. Từ các ghi chú đánh giá ( superuser.com/review/suggested-edits/535793 ) có vẻ như mọi người sẽ thích tôi đăng mã của mình trong một câu trả lời riêng biệt, vì vậy tôi đã đăng ở đây: superuser.com/a/1079174/156700 . Hy vọng điều này hữu ích cho người khác. Cảm ơn một lần nữa cho giải pháp của bạn.
JohnLBevan

8

Nếu bạn muốn tìm các chia sẻ của máy cục bộ, bạn chỉ cần làm Get-SmbShare:

> Get-SmbShare

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

3

Mở rộng câu trả lời của 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
Bạn có thể giải thích những gì mở rộng của bạn làm gì?
bertieb

3

Cảm ơn Mark Henderson cho giải pháp của mình . Tôi đã thêm chức năng trình bao bọc để giúp chức năng này gọi PowerShell thân thiện hơn. Tôi đã sử dụng một cách tiếp cận khác để chia nhỏ dữ liệu (phức tạp hơn, không tốt hơn); có thể dễ dàng được chuyển đổi dựa trên sở thích.

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

Trên Windows 8 trở lên và Windows Server 2012 trở lên, bạn có thể sử dụng Get-SmbShare từ mô-đun SmbShare.


0

Công cụ Windows Resource Kit: rmtshare .

Chạy dưới id với quyền quản trị viên trên máy chủ từ xa hoặc tạo kết nối ipc $ đến máy chủ từ xa.

rmtshare \\servername

Bạn có thể mở rộng câu trả lời của mình thêm một chút để bao gồm các bước cần thiết để giải quyết vấn đề không?
Cfinley

0

Đây là một lớp lót PowerShell sử dụng chế độ xem mạng để liệt kê tất cả các chia sẻ từ xa mà người dùng có thể thấy - không có nghĩa là họ có quyền truy cập.

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

Nếu bạn muốn xem họ có (ít nhất) quyền truy cập đọc hay không, bạn có thể chạy:

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

Nếu bạn cần lưu đầu ra, bạn luôn có thể chuyển nó sang Xuất-CSV bằng cách ném vào phần sau sau dấu ngoặc cuối:

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

Toàn bộ điều này không hoàn hảo khi chế độ xem mạng gây ra lỗi nhưng tôi đã viết nó dựa trên các nhận xét ở đây và nó hoạt động khá tốt và hữu ích cho những gì tôi cần vì vậy tôi nghĩ tôi muốn chia sẻ. :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.