Powershell — Членство в группе пользователей из текстового файла

#powershell #csv

#powershell #csv

Вопрос:

У меня есть список пользователей, и я хочу экспортировать имена их групп, отсортированные по алфавиту. Следующий сценарий не работает во внутреннем ForEach-Object цикле.

 Get-Content users.txt | ForEach-Object {
    $user = $_; 

    Get-ADUser –Identity $user –Properties MemberOf | Select-Object -ExpandProperty MemberOf | sort

    ForEach-Object {

        New-Object PSObject -property @{User=$user;Group=$_;}

    }
} | Export-Csv -Path 'your_file_path.csv' -NoTypeInformation
  

Комментарии:

1. Какова цель улучшения? Удобочитаемость? Эффективность процессора? Эффективность использования памяти? Скорость? Обработка ошибок?

2. Я думаю, «заставить это работать», потому что вложенный foreach-object файл не имеет ввода.

3. Тогда вам нужно уточнить вопрос, чтобы читатели знали, что вам нужно.

4. @Tony Hinkle Извините, ребята. Мой пост был отредактирован супер-администратором. Я новичок в powershell!. У меня есть список пользователей, я хочу отсортировать членство в группах пользователей по алфавиту, а затем экспортировать только имена членов их групп. Этот скрипт экспортирует CH # Плюс подразделение и т. Д. И т. Д. Как я могу улучшить скрипт, пожалуйста?

5. @TessellatingHeckler Извините

Ответ №1:

ForEach-Object просто сидит там один — вам нужно либо передать ему объект, либо присвоить объект переменной и использовать foreach вместо этого цикл по объекту. Я выбрал второй подход, приведенный ниже, поскольку чрезмерное количество каналов затрудняет чтение сценариев (для меня).

 Get-Content c:tempusers.txt | ForEach-Object {
    $user = $_; 

    $AdUser = Get-ADUser –Identity $user –Properties MemberOf | Select-Object -ExpandProperty MemberOf | get-adgroup | select -ExpandProperty Name | sort

    foreach($group in $AdUser) {

        New-Object PSObject -property @{User=$user;Group=$group;} | Export-Csv -Path 'c:tempout.csv' -NoTypeInformation -Append

    }
} 
  

…и если вы хотите передать его и использовать ForEach-Object , вам просто нужно поместить канал после sort и переместить Export-Csv , чтобы он экспортировал новый созданный объект:

 Get-Content c:tempusers.txt | ForEach-Object {
    $user = $_; 

    Get-ADUser –Identity $user –Properties MemberOf | Select-Object -ExpandProperty MemberOf | get-adgroup | select -ExpandProperty Name | sort | 

    ForEach-Object {
        New-Object PSObject -property @{User=$user;Group=$_;} | Export-Csv -Path 'c:tempout.csv' -NoTypeInformation -Append
    }
}  
  

Комментарии:

1. ханкл — Большое спасибо за ответ. У меня есть список пользователей, я хочу сортировать имена участников каждой группы пользователей только по алфавиту, а затем экспортировать только имена членов их групп. Этот скрипт экспортирует CH # Плюс подразделение и т. Д. И т. Д. Как я могу улучшить скрипт, пожалуйста? Спасибо

2. @kbriaz Я обновил ответ, чтобы выходные данные включали только имена групп, а не различимые имена.

3. Большое спасибо. Скрипт работает как по волшебству, он экспортирует имена всех групп пользователей в списке. Однако в окне PowerShell я получаю следующую ошибку. (get-adgroup: не удается найти объект с идентификатором: ‘CN = #XXX Великобритания Все (1), OU = XXX группы, OU = XXX группы, DC = XXX, DC = XXX, DC = XX’ в разделе: ‘DC = XX, DC = XXX, DC =XXX’) Есть идеи, почему это? Должен ли я просто игнорировать это? Поскольку экспорт содержит данные, которые мне нужны. Извините за беспокойство и еще раз спасибо за помощь. Ta

4. Я понятия не имею, почему это вызвало бы эту ошибку. Передача отличительного имени является допустимым вводом для get-adgroup ( technet.microsoft.com/en-us/library /… )