2014-06-17 01:51:35 +0000 2014-06-17 01:51:35 +0000
19
19
Advertisement

PowerShell 共有フォルダのリストを取得

Advertisement

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

\MYPC\Test1

\MYPC\Test2

これが今のところのコードです。

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

Write-Host $FolderList

しかし、「パスが見つかりません」と出てきます。\Server\Shareをディレクトリにした場合の例は見られるのですが、\Serverを検索するだけでも可能なのでしょうか?

Advertisement
Advertisement

回答 (8)

24
24
24
2014-06-17 02:38:03 +0000

これを試してみてください。

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

Ref: PowerShellを使ったWindowsのシェア一覧_.

14
14
14
2014-06-17 02:58:41 +0000

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

これだけでは特に解析はできませんが、これを配列に放り込んで、データを一行ずつ処理することができます:

$sharedFolders = (NET.EXE VIEW \enetsqnap01)

これで配列ができ、$sharedFolders[7]から始まる株式が得られます。これは株名自体には出現しないでしょうし、株名が非常に長い場合を除いて、株名とタイプフィールドの間に1つのスペースを残すだけでうまくいくはずです:

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

これらをForEachと条件付きロジックで処理することができます。これは完全ではありませんが、ほとんどのユースケースでは機能するはずです。

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

(net view \enetsqnap01) | % { if($_.IndexOf(' Disk ') -gt 0){ $_.Split(' ')[0] } }
8
Advertisement
8
8
2016-05-09 14:46:58 +0000
Advertisement

ローカルマシンの共有を見つけたい場合は、Get-SmbShareを実行するだけです。

> Get-SmbShare

Name ScopeName Path Description
---- --------- ---- -----------
ADMIN$ * C:\WINDOWS Remote Admin
C$ * C:\ Default share
3
3
3
2015-09-15 02:19:32 +0000

マーク・ヘンダーソンの回答](https://superuser.com/a/769694/461558)を拡張しています。

$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
Advertisement
3
3
2016-05-20 22:20:09 +0000
Advertisement

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
1
1
1
2018-09-27 20:40:01 +0000

Windows 8 以上、Windows Server 2012 以上では、SmbShare モジュールから Get-SmbShare を使用することができます。

0
Advertisement
0
0
2019-04-08 20:22:36 +0000
Advertisement

ここでは、ネットビューを使用して、ユーザが閲覧できるすべてのリモート共有を列挙する 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

ネットビューがエラーを吐いたときに全体が完璧ではありませんが、ここのコメントを元に書いてみましたが、かなりうまく機能していて、必要なものに役立っているので、共有しようと思いました。)

0
0
0
2015-04-10 17:14:25 +0000

Windowsリソースキットツール。rmtshare ](http://ss64.com/nt/rmtshare.html).

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

rmtshare \servername
```.
Advertisement

関連する質問

2
10
11
14
7
Advertisement
Advertisement