PowerShellは共有フォルダーのリストを取得します


19

ファイル共有で共有されているフォルダーのリストを取得しようとしています。現時点では、2つのテストフォルダーがあります。

\\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権限が必要ですが、これは特にポータブルなソリューションではありません。
マークヘンダーソン14年

3
さらに、RPC通信が必要になります。これは、汎用SMBが許可されている場合でも、多くの構成でファイアウォールで保護されている可能性があります。確かに、net view隠されたシェアを返しません。
syneticon-dj 14年

14

私が知っているコマンドラインから共有をリモートで列挙する方法は1つしかありません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.

これ自体は特に解析できませんが、配列にスローして、データを1行ずつ処理できます。

$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ここには表示されません。編集が拒否されたのでしょうか?もう一度送信すると、他の人が届く前に時間内に確認できるかどうかがわかります。
マークヘンダーソン

@Mark Hendersonに感謝します。レビューノート(から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
}

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


0

Windowsリソースキットツール:rmtshare

リモートサーバーの管理者権限でidで実行するか、リモートサーバーへのipc $接続を確立します。

rmtshare \\servername

問題を解決するために必要な手順を含めるために、答えをもう少し広げることはできますか?
クフィンリー

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.