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

PowerShell krijg lijst van gedeelde mappen

Advertisement

Ik probeer een lijst te krijgen van mappen die gedeeld worden op een fileshare. Op dit moment heb ik twee testmappen:

\MYPC\Test1

\MYPC\Test2

Dit is de code die ik op dit moment heb:

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

Write-Host $FolderList

Maar dit komt met “kan het pad niet vinden”. Ik kan voorbeelden zien van hoe dit te doen voor \Server\Share als de directory, maar is het mogelijk om alleen de \Server te zoeken?

Advertisement
Advertisement

Antwoorden (8)

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

Probeer dit eens:

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

Ref: Shares weergeven in Windows w/ PowerShell _

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

Er is maar één manier om aandelen op afstand op te sommen vanaf de commandoregel die ik ken, en dat is met 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.

Dit is op zichzelf niet erg leesbaar, maar je kunt het in een array gooien om de gegevens regel voor regel te verwerken:

$sharedFolders = (NET.EXE VIEW \enetsqnap01)

Je hebt nu een array, en beginnend bij $sharedFolders[7] heb je je shares. Je zou dan split kunnen zetten op iets als een dubbele spatie - die waarschijnlijk niet in een aandelennaam zelf voorkomt, en zou moeten werken tenzij je aandelennaam erg lang is, en alleen een enkele spatie laten tussen de aandelennaam en het typeveld:

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

Je zou deze kunnen verwerken door een ForEach te gebruiken en wat voorwaardelijke logica. Het zou niet perfect zijn, maar het zou voor de meeste gevallen moeten werken.

Om het kort te houden, om alleen de bestandsnamen naar de console te sturen:

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

Als je de shares van de lokale machine wilt vinden, kun je gewoon Get-SmbShare doen:

> 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

Uitbreidend op Mark Henderson’s antwoord :

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

Met dank aan Mark Henderson voor zijn oplossing . Ik heb een wrapper functie toegevoegd om deze functie oproep meer PowerShell vriendelijk te maken. Ik heb een andere aanpak gebruikt om de gegevens op te splitsen (complexer, niet beter); dat kan gemakkelijk omgewisseld worden op basis van voorkeur.

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

Op Windows 8 of hoger en Windows Server 2012 of hoger, kunt u Get-SmbShare van de SmbShare module gebruiken.

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

Hier is een PowerShell one liner die net view gebruikt om alle remote shares op te sommen die een gebruiker kan zien - wil niet zeggen dat ze toegang hebben.

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

Als je wilt zien of ze (ten minste) leestoegang hebben, kun je uitvoeren:

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

Als je de uitvoer wilt opslaan, kun je die altijd naar Export-CSV pijpen door na het laatste haakje het volgende in te voegen:

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

Het hele ding is niet perfect als net view een fout geeft, maar ik heb het geschreven op basis van de commentaren hier en het werkt vrij goed en is nuttig voor wat ik nodig heb, dus ik dacht dat ik het zou delen :)

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

Windows Hulpmiddelen Kit gereedschap: rmtshare .

Voer het uit onder id met beheerdersrechten op de externe server of maak een ipc$ verbinding met de externe server.

rmtshare \servername
Advertisement

Gerelateerde vragen

2
10
11
14
4
Advertisement
Advertisement