Я пытаюсь провести аудит управления доступом к сети, собирая группы AD пользователя, их описания, а затем выводя их так, как показано в этом примере:
[User]
@[1]Groups : @[1]GroupDescription @[2]...
@[3]...
Ниже то, что у меня есть на данный момент.
$UserGroups = @{
User = Read-Host -Prompt "What user do You want to look up Access for?"
Groups = (Get-ADUser $User -Properties MemberOf).MemberOf
GroupsDescriptions = (Get-ADUser $User -Properties MemberOf).MemberOf | % {(Get-ADGroup $_ -Properties *).description}
}
$Object = New-Object psobject -Property $UserGroups
$Object | format-table | Export-Csv c:\tmp\test.csv
Хотя вывод очень странный. Я этого не понимаю. Ниже приведен результат Get-Content C:tmp\test.csv.
#TYPE Microsoft.PowerShell.Commands.Internal.Format.FormatStartData "ClassId2e4f51ef21dd47e99d3c952918aff9cd","pageHeaderEntry","pageFooterEntry","autosizeInfo","shapeInfo","groupingEntry" "033ecb2bc07a4d43b5ef94ed5a35d280",,,,"Microsoft.PowerShell.Commands.Internal.Format.TableHeaderInfo", "9e210fe47d09416682b841769c78b8a3",,,,, "27c87ef9bbda4f709f6b4002fa4af63c",,,,, "4ec4f0187cb04f4cb6973460dfe252df",,,,, "cf522b78d86c486691226b40aa69e95c",,,,,
Я пробовал выводить в файл .txt с помощью Out-file, но я всегда обрезаю каждое свойство с помощью ... в конце. Я использовал -Autosize и -Expand при форматировании данных перед их передачей в строку экспорта.
Любые предложения или советы будут чрезвычайно полезны.
Вещи, которые я рассмотрю позже Просмотрите каждую строку в объекте PowerShell и извлеките переменные.Powershell & ActiveDirectory — попытка вывести пользователей в группу и их членствоOut-file обрезает мой текст при попытке вывести таблицу Спасибо!
Проблема в том, что вы подключаетесь к Format-Table
, прежде чем к Export-Csv
. Используйте Format-Table
только для отображения вещей на экране. Исправление состоит в том, чтобы просто удалить это.
$Object | Export-Csv c:\tmp\test.csv
Когда я делаю это, только пользователь возвращается правильно, в группах Microsoft.ActiveDirectory.Management.ADPropertyValueCollection, а в GroupsDescriptions — System.Object[]
Как указано, используйте только командлеты Format-*
для получения вывода для отображения, никогда для вывода данные, который должен быть обработан программно позже. Что Format-Table
выводит, так это объекты, представляющие инструкции по форматированию, и это свойства их, которые оказались в вашем CSV-файле — см. этот ответ для получения дополнительной информации.
В чтобы включить коллекции (массивы) в вывод CSV, вы должны преобразовать их в одна строка с использованием самостоятельно выбранного разделителя. В противном случае Export-Csv
просто вызывает .ToString()
для сам объект коллекции, что дает имя типа коллекции и никакой информации о ее элементах.
Поэтому используйте что-то вроде следующего, в котором используется ', '
в качестве строки-разделителя для представления имен и описаний групп в одном столбце:
$UserGroups = [pscustomobject] @{
User = ($user = Read-Host -Prompt "What user do You want to look up Access for?")
Groups = ($groups = (Get-ADUser $User -Properties MemberOf).MemberOf) -join ', '
GroupsDescriptions = (
$groups | ForEach-Object { (Get-ADGroup $_ -Properties *).Description }
) -join ', '
}
$UserGroups | Export-Csv c:\tmp\test.csv
Примечание:
[pscustomobject] @{ ... }
используется для напрямую создания пользовательского объекта, который представляет собой синтаксический сахар, доступный начиная с PowerShell v3, который проще и эффективнее, чем вызов New-Object
.
Чтобы использовать результат вашего вызова Read-Host
в более поздних свойствах определения вашего объекта, вы должны кэшировать его в aux. переменная $user
(обратите внимание, что помещение присваивания в (...)
передает его значение.
Точно так же результат вызова Get-ADUser
кэшируется в aux. переменная $groups
, чтобы ее не нужно было повторять в значении GroupsDescriptions
.
Однако, как указывает Зетт42, может быть чище сделать присваивания $user = ...
и $groups = ...
отдельными операторами и поместить их до в конструкцию объекта.
Удалите
| format-table
из последней строки.Format-Table
используется исключительно для вывода данных на консоль.