PowerShell Получить Список Общих Папок

Я пытаюсь получить список папок, которые являются общими в общей папке. На данный момент у меня две тестовые папки:

MYPCTest1

MYPCTest2

это код у меня есть на данный момент:

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

Write-Host $FolderList

но это приходит с "не удается найти путь". Я могу видеть примеры того, как это сделать для ServerShare как каталог, но можно ли просто искать Server?

25
задан JasonMArcher
22.05.2023 0:19 Количество просмотров материала 2740
Распечатать страницу

7 ответов

попробуйте это:

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

Ref:список общих папок в Windows W / PowerShell

20
отвечен Tamerz 2023-05-23 08:07

есть только один способ перечисления акций удаленно из командной строки, что я знаю, а вот с 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.

это не особенно синтаксический анализ сам по себе, но, вы можете бросить его в массив для обработки данных строка за строкой:

$sharedFolders = (NET.EXE VIEW \enetsqnap01) 

теперь у вас есть массив, и начиная с $sharedFolders[7] у вас есть свои акции. Вы могли бы тогда split на что-то вроде двойного пространства-вряд ли появится в самом имени общего ресурса, и должно работать, если ваш имя очень давно, оставив только один пробел между имя и тип поля:

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

вы можете обработать их, используя ForEach и некоторую условную логику. Это не было бы идеально, но он должен работать для большинства случаев использования.

для краткости выведите имена файлов в консоль:

(net view \enetsqnap01) | % { if($_.IndexOf(' Disk ') -gt 0){ $_.Split('  ')[0] } }
11
отвечен Mark Henderson 2023-05-23 10:24

Если вы хотите найти доли локальной машины, вы можете просто сделать Get-SmbShare:

> Get-SmbShare

Name                          ScopeName                     Path                          Description
----                          ---------                     ----                          -----------
ADMIN$                        *                             C:\WINDOWS                    Remote Admin
C$                            *                             C:\                           Default share
6
отвечен Klas Mellbourn 2023-05-23 12:41

расширения ответ Марка Хендерсона:

$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
отвечен DingoCC 2023-05-23 14:58

спасибо Марку Henderson на решение. Я добавил функцию-оболочку, чтобы сделать вызов этой функции более удобным для PowerShell. Я использовал другой подход к разбиению данных (более сложный, а не лучший); это можно легко переключить на основе предпочтений.

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*).*",'').Length
                }
            }
            $obj | Add-Member -Name GetValue -MemberType ScriptMethod {
                param([string]$line)
                process {
                    $line -replace ".{$($_.StartIndex)}(.{$($_.Length)}).*",''
                }
            }
            $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
3
отвечен JohnLBevan 2023-05-23 17:15

Windows Resource Kit инструмент:rmtshare.

запустить код с правами администратора на удаленном сервере или сделать IPC$ подключение к удаленному серверу.

rmtshare \servername
0
отвечен Windows Admin 2023-05-23 19:32

в Windows 8 и выше и Windows Server 2012 и выше можно использовать Get-SmbShare из модуля SmbShare.

0
отвечен JamieSee 2023-05-23 21:49

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх