Получите список общих файловых ресурсов без прав администратора с нескольких серверов Windows

ЦЕЛЬ: получить файл CSV со следующей информацией:

  • Имя компьютера
  • Поделиться Имя
  • Поделиться путем
  • Поделиться Описание

для всех неадминистративных (тип 0) общих ресурсов SMB на всех серверах из списка (текстовый файл).

НАЧАЛЬНЫЙ КОД:

param (
    [Parameter(Mandatory=$true,Position=0)]
    [ValidateNotNullOrEmpty()]
    [String]
    $path
)

$computers = Get-Content $path
$shareInfo = @()

ForEach ($computer in $computers) {
    $shares = gwmi -Computer $computer -Class Win32_Share -filter "Type = 0" | Select Name,Path,Description

    $shares | % {
        $ShareName = $_.Name
        $Props = [ordered]@{
            Computer = $computer
            ShareName = $_.Name
            Path = $shares.Path
            Description = $shares.Description
        }
    }

    $ShareInfo += New-Object -TypeName PSObject -Property $Props
}

$shareInfo | Export-CSV -Path .\shares.csv -NoType

ВЫВОД КОДА:

"Computer","ShareName","Path","Description"
"SERVER1","SHARE1","System.Object[]","System.Object[]"
"SERVER2","SHARE12","System.Object[]","System.Object[]"
"SERVER3","SHARE3","System.Object[]","System.Object[]"

ПРОБЛЕМА:

Хотя код обеспечивает вывод для каждого сервера, он, похоже, не включает все общие ресурсы с серверов. Кроме того, поля «Путь» и «Описание» не содержат достоверной информации.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

Код:

$shares = gwmi -Computer $computer -Class Win32_Share -filter "Type = 0" | Select Name,Path,Description

Предоставляет хорошую информацию, как показано ниже:

Name           Path                                Description
----           ----                                -----------
print$         C:\WINDOWS\system32\spool\drivers   Printer Drivers
Share          D:\Share
SHARE2         D:\SHARE2
Software       C:\Software                         The Software

person McKenning    schedule 23.11.2015    source источник


Ответы (1)


$shares | % {
    $ShareName = $_.Name
    $Props = [ordered]@{
        Computer = $computer
        ShareName = $_.Name
        Path = $shares.Path
        Description = $shares.Description
    }
}

Вы используете $shares вместо $_ для свойств Path и Description, поэтому каждому из этих свойств назначается список значений соответствующего свойства каждого элемента коллекции $shares.

Кроме того, почему вы в первую очередь создаете настраиваемые объекты, когда вам просто нужно отфильтровать результаты запроса WMI? Имя компьютера можно получить из свойства __SERVER (или PSMachineName). Кроме того, тип 0 означает общий диск, а не административный ресурс. Последних нужно отфильтровать по другим критериям (обычно по описанию и / или имени).

$filter = "Type = 0 And Description != 'Default Share' And " +
          "Name != 'ADMIN$' And Name != 'IPC$'"

$computers |
  ForEach-Object { Get-WmiObject -Computer $_ -Class Win32_Share -Filter $filter } |
  Select-Object @{n='Computer';e={$_.__SERVER}}, Name, Path, Description |
  Export-Csv -Path .\shares.csv -NoType
person Ansgar Wiechers    schedule 23.11.2015
comment
Отсутствующие переменные конвейера были вызваны усталостью кодирования. Я уверен, что поймал бы их ... в конце концов. :) Кроме того, я создавал собственные объекты, потому что я не очень хорошо разбираюсь в WMI и знал только, как добавлять столбцы CSV через объекты. Я узнаю все больше и больше с каждым днем. Оцените ответ! - person McKenning; 23.11.2015