Tente isto:
get-WmiObject -class Win32_Share -computer dc1.krypted.com
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
?
Tente isto:
get-WmiObject -class Win32_Share -computer dc1.krypted.com
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] } }
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
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
}
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
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
No Windows 8 ou superior e no Windows Server 2012 ou superior, você pode usar Get-SmbShare do módulo SmbShare.