PowerShell Obter lista de pastas compartilhadas

13

Estou tentando obter uma lista de pastas compartilhadas em um compartilhamento de arquivos. No momento, tenho duas pastas de teste:

\MYPC\Test1

\MYPC\Test2

Este é o código que tenho no momento:

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

Write-Host $FolderList

Mas isso vem com "não pode encontrar o caminho". Eu posso ver exemplos de como fazer isso para \Server\Share como o diretório, mas é possível apenas pesquisar o \Server ?

    
por The Woo 17.06.2014 / 03:51

7 respostas

20

Tente isto:

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

Ref: Listar compartilhamentos no Windows com o PowerShell

    
por 17.06.2014 / 04:38
11

Existe apenas uma maneira de enumerar compartilhamentos remotamente a partir da linha de comando que eu conheço, e isso é com 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.

Isso não é particularmente analisável por si só, mas você pode lançá-lo em uma matriz para processar os dados linha por linha:

$sharedFolders = (NET.EXE VIEW \enetsqnap01) 

Agora você tem uma matriz e, a partir de $sharedFolders[7] , você tem seus compartilhamentos. Você poderia então split em algo como um espaço duplo - provavelmente não apareceria em um nome de compartilhamento, e deve funcionar a menos que seu nome de compartilhamento seja muito longo, deixando apenas um único espaço entre o nome do compartilhamento e o campo type:

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

Você poderia processá-los usando um ForEach e alguma lógica condicional. Não seria perfeito, mas deveria funcionar para a maioria dos casos de uso.

Por uma questão de brevidade, basta enviar os nomes dos arquivos para o console:

(net view \enetsqnap01) | % { if($_.IndexOf(' Disk ') -gt 0){ $_.Split('  ')[0] } }
    
por 17.06.2014 / 04:58
6

Se você quiser encontrar os compartilhamentos da máquina local, basta fazer Get-SmbShare :

> Get-SmbShare

Name                          ScopeName                     Path                          Description
----                          ---------                     ----                          -----------
ADMIN$                        *                             C:\WINDOWS                    Remote Admin
C$                            *                             C:\                           Default share
    
por 09.05.2016 / 16:46
3

Expandindo a a resposta de 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
}
    
por 15.09.2015 / 04:19
3

Obrigado a Mark Henderson pela sua solução . Eu adicionei uma função de wrapper para ajudar a tornar essa função mais amigável ao PowerShell. Eu usei uma abordagem diferente para dividir os dados (mais complexa, não melhor); que pode ser facilmente alternado com base na preferência.

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
    
por 21.05.2016 / 00:20
0

Ferramenta Windows Resource Kit: rmtshare .

Execute o id com permissões de administrador no servidor remoto ou faça uma conexão $ ipc com o servidor remoto.

rmtshare \servername
    
por 10.04.2015 / 19:14
0

No Windows 8 ou superior e no Windows Server 2012 ou superior, você pode usar Get-SmbShare do módulo SmbShare.

    
por 27.09.2018 / 22:40