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

PowerShell Obter Lista de Pastas Partilhadas

Estou a tentar obter uma lista de pastas que são partilhadas numa partilha de ficheiros. Neste momento, tenho duas pastas de teste:

\MYPC\Test1

\MYPC\Test2

Este é o código que tenho neste momento:

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

Write-Host $FolderList

Mas isto vem com “não consigo encontrar o caminho”. Posso ver exemplos de como fazer isto para \Server\Share como o directório, mas será possível apenas pesquisar o \Server?

Respostas (8)

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

Experimente isto:

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

Ref: Listar Acções no Windows c/ PowerShell _

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

Só há uma forma de enumerar acções remotamente a partir da linha de comando que conheço, e que é 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.

Isto não é particularmente parsable por si só, mas, pode atirá-lo para um array para processar os dados linha a linha:

$sharedFolders = (NET.EXE VIEW \enetsqnap01)

Tem agora um array, e a partir de $sharedFolders[7] tem as suas acções. Poderá então split em algo como um espaço duplo - improvável que apareça no próprio nome da acção, e deverá funcionar a menos que o nome da sua acção seja muito longo, deixando apenas um único espaço entre o nome da acção e o campo de tipo:

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

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

Para uma maior brevidade, para apenas emitir os nomes dos ficheiros para a consola:

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

Se quiser encontrar as partes da máquina local, pode apenas fazer 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

Expandindo em Mark Henderson’s answer :

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

Obrigado a Mark Henderson por a sua solução . Adicionei uma função de invólucro para ajudar a tornar esta função mais amigável com o PowerShell. Utilizei uma abordagem diferente para quebrar os dados (mais complexos, não melhores); isso pode ser facilmente trocado 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
1
1
1
2018-09-27 20:40:01 +0000

No Windows 8 ou superior e Windows Server 2012 ou superior, pode usar Get-SmbShare a partir do módulo SmbShare.

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

Aqui está um revestimento PowerShell que utiliza a vista de rede para enumerar todas as acções remotas que um utilizador pode ver - não significa que tenham acesso.

net view | Where {$_ -like "\*"} | %{$comp = $_.Split(" ")[0]; net view $comp | Where {$_ -like "*Disk*"} | %{$share = $_.Split(" ")[0]; $fullpath = Join-Path $comp $share; $fullpath}}

Se quiser ver se eles têm (pelo menos) acesso de leitura, pode correr:

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)}}}

Se precisar da saída guardada, pode sempre canalizá-la para Export-CSV lançando o seguinte depois do último suporte:

| Export-CSV "\path\to\file.csv" -NoTypeInformation

A coisa toda não é perfeita quando a net view lança um erro, mas escrevi-a com base nos comentários aqui e funciona bastante bem e é útil para o que eu preciso, por isso pensei em partilhar :)

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

Ferramenta do Windows Resource Kit: (http://ss64.com/nt/rmtshare.html).

Ou correr sob id com permissões de administrador no servidor remoto ou fazer uma ligação ipc$ ao servidor remoto.

rmtshare \servername
```.