web-dev-qa-db-ja.com

PowerShell共有フォルダ一覧の取得

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

\\MYPC\Test1

\\MYPC\Test2

これは私が現在持っているコードです:

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

Write-Host $FolderList

しかし、これは「道を見つけることができない」と思いつきます。ディレクトリとしての\\Server\Shareに対してこれを行う方法の例を見ることができますが、\\Serverを単に検索することは可能ですか?

17
The Woo

これを試して:

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

参照:/ PowerShellを使用したWindowsの共有の一覧表示

22
Tamerz

私が知っているコマンドラインからリモートで共有を列挙する方法は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を付けることができます。共有名自体には表示されません。共有名が非常に長い場合を除き、共有名とタイプフィールドの間に1つのスペースを残します。

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

ForEachといくつかの条件付きロジックを使用してこれらを処理できます。それは完璧ではないでしょう、しかしそれはほとんどの使用例のために働くべきです。

簡潔にするために、ファイル名をコンソールに出力するだけです。

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

もしあなたがローカルマシンのシェアを見つけたいのなら、Get-SmbShareを実行するだけです。

> Get-SmbShare

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

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
}
3
DingoCC

Mark Henderson氏の解決策 に感謝します 。この関数をより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
3
JohnLBevan

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

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

rmtshare \\servername
0
Windows Admin

Windows 8以上およびWindows Server 2012以上では、SmbShareモジュールから Get-SmbShare を使用できます。

0
JamieSee

これは、ユーザーが見ることができるすべてのリモート共有を列挙するためにネットビューを使用するPowerShell Oneライナーです。

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

ネットビューでエラーが発生した場合、全体的なことは完璧ではありませんが、ここでのコメントに基づいて作成しました。 :)

0