PowerShell 공유 폴더 목록 가져 오기


19

파일 공유에서 공유되는 폴더 목록을 얻으려고합니다. 현재 두 개의 테스트 폴더가 있습니다.

\\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

참고 : PowerShell이있는 Windows의 공유 목록


5
이를 위해서는 대상 시스템에 대한 WMI 권한이 필요하며 특히 휴대용 솔루션이 아닙니다.
Mark Henderson

3
또한 일반 SMB가 허용되는 경우에도 많은 구성에서 방화벽을 형성 할 수있는 RPC 통신이 필요합니다. 물론, 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] } }

참고 : 콜을 마무리하고 텍스트 출력을 반 지능형 방식으로 나누는 도우미 기능을 추가했습니다.
JohnLBevan

1
@ JohnLBevan 나는 여기에 보이지 않습니다. 아마도 편집이 거부 되었을까요? 다시 제출하면 다른 사람이 도착하기 전에 제 시간에 검토 할 수 있는지 확인할 수 있습니다.
Mark Henderson

@ 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

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

그의 솔루션에 대해 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

Windows 8 이상 및 Windows Server 2012 이상 에서는 SmbShare 모듈에서 Get-SmbShare 를 사용할 수 있습니다 .


0

Windows 리소스 키트 도구 : rmtshare .

원격 서버에서 관리자 권한으로 id로 실행하거나 원격 서버에 ipc $로 연결하십시오.

rmtshare \\servername

문제를 해결하는 데 필요한 단계를 포함하도록 답변을 조금 더 확장 할 수 있습니까?
Cfinley

0

다음은 net view를 사용하여 사용자가 볼 수있는 모든 원격 공유를 열거하는 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

net view가 오류를 던질 때 모든 것이 완벽하지는 않지만 여기에 의견을 바탕으로 작성했으며 꽤 잘 작동하며 필요한 것에 도움이되므로 공유 할 것이라고 생각했습니다. :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.