Попытка вывести пользовательский объект powershell, где я могу выровнять каждую строку двух разных переменных, содержащих категорию: описание

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

Santiago Squarzon 01.04.2022 20:26
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
1
40
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проблема в том, что вы подключаетесь к Format-Table, прежде чем к Export-Csv. Используйте Format-Table только для отображения вещей на экране. Исправление состоит в том, чтобы просто удалить это.

$Object | Export-Csv c:\tmp\test.csv

Когда я делаю это, только пользователь возвращается правильно, в группах Microsoft.ActiveDirectory.Management.ADPropertyValueCollecti‌​on, а в GroupsDescriptions — System.Object[]

Liam Chaney 01.04.2022 20:39
Ответ принят как подходящий
  • Как указано, используйте только командлеты 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 = ... отдельными операторами и поместить их до в конструкцию объекта.

Другие вопросы по теме