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

PowerShell Obtener Lista De Carpetas Compartidas

Estoy tratando de obtener una lista de carpetas compartidas en un archivo compartido. De momento tengo dos carpetas de prueba:

\MYPC\Test1

\MYPC\Test2

Este es el código que tengo en este momento:

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

Write-Host $FolderList

Pero esto sale con “no puede encontrar la ruta”. Puedo ver ejemplos de cómo hacer esto para \Server\Share como el directorio, pero ¿es posible buscar sólo el \Server?

Respuestas (8)

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

Pruebe esto:

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

Ref: Lista de recursos compartidos en Windows con PowerShell _

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

Sólo hay una forma de enumerar acciones remotamente desde la línea de comandos que yo conozca, y es con 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.

Esto no es particularmente analizable por sí mismo, pero, puede lanzarlo en un array para procesar los datos línea por línea:

$sharedFolders = (NET.EXE VIEW \enetsqnap01)

Ahora tiene un array, y empezando en $sharedFolders[7] tiene sus acciones. Podría entonces split en algo como un doble espacio - que es poco probable que aparezca en un nombre de acción en sí mismo, y debería funcionar a menos que su nombre de acción sea muy largo, dejando sólo un único espacio entre el nombre de la acción y el campo de tipo:

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

Podría procesar estos usando un ForEach y algo de lógica condicional. No sería perfecto, pero debería funcionar para la mayoría de los casos de uso.

Para ser más breve, sólo hay que enviar los nombres de los archivos a la consola:

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

Si quieres encontrar los recursos compartidos de la máquina local puedes simplemente hacer 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

Ampliando la respuesta 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
}
3
3
3
2016-05-20 22:20:09 +0000

Gracias a Mark Henderson por su solución . He añadido una función envolvente para ayudar a que esta llamada a la función sea más amigable con PowerShell. He utilizado un enfoque diferente para dividir los datos (más complejo, no mejor); que puede ser fácilmente cambiado en base a la preferencia.

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

En Windows 8 o superior y Windows Server 2012 o superior, puede utilizar Get-SmbShare del módulo SmbShare.

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

Aquí hay una línea de PowerShell que utiliza la vista de red para enumerar todos los recursos compartidos remotos que un usuario puede ver - no significa que tengan acceso.

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

Si quieres ver si tienen (al menos) acceso de lectura, puedes ejecutar:

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

Si necesitas guardar la salida siempre puedes canalizarla a Export-CSV lanzando lo siguiente después del último paréntesis:

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

El conjunto no es perfecto cuando net view lanza un error pero lo escribí basándome en los comentarios de aquí y funciona bastante bien y es útil para lo que necesito así que pensé en compartirlo. :)

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

Herramienta del kit de recursos de Windows: rmtshare .

Ejecutar bajo id con permisos de administrador en el servidor remoto o realizar una conexión ipc$ al servidor remoto.

rmtshare \servername