Поиск в Active Directory и экспорт списка имен в группах mulitpule в txt-файл для powershell

Я пытаюсь создать простой сценарий PowerShell, который будет просматривать список групп Active Directory из текстового файла, затем искать в Active Directory группы (независимо от типа), затем получать список участников в каждой из групп и затем выведите их атрибут «имя» каждого пользователя в выходной текстовый файл. Сейчас я почти все сделал, кроме последней части. Когда он выводит имя в текстовый файл, он выводит только ОДНО имя в файл, а не остальные 300. Однако, если я снимаю функцию вывода, скрипт выводит все имена, как я хочу, только в консоль. Может кто-нибудь объяснить, почему мой метод сделать это не работает? Мне действительно любопытно, почему я не могу направить вывод в файл так, как хочу. Кроме того, сценарий проходит через все правильно, и я знаю, что он также находит группы (я знаю это, потому что, когда я смотрю на текстовые файлы, я вижу одну запись для каждого файла), но сценарий проходит через первые 8 групп и начинает выдает ошибки, говорящие о том, что он не может найти определенные группы, которые он должен пройти по циклу. Но он их уже находил и выдавал только по одной записи в каждый из файлов. Почему это?

Меня больше интересует ответ на мой первый вопрос, потому что скрипт по-прежнему делает то, что должен делать правильно.

Итак, чтобы повторить, я хотел бы знать, почему скрипт выводит только одно имя в файл, когда он должен выводить 300+ для каждой группы.

      ##This is variable that will hold the file path for the list of Active Directory Groups##

 $file='C:\Users\me\Desktop\DL_Names.txt';

 ##Command to dump the list into a variable##

 $DLnames=get-content $file;

 ##This is the variable to hold the path for where the output files are to be placed##

 [string]$path='C:\Users\me\Desktop\DL_repository\';

 ##Loop through the variable and for each entry preform the instruction listed##

 foreach ($name in $DLnames)
 {

 ##These two variables are used to create the file name for the output files##

 [string]$filename=$name+'.txt';

  [string]$Fullpath=$path+$filename;

 #This variable is used to determine if the groups exists in Active Directory##

 $verifygroupexists = Get-ADGroup -Identity $name;

 ##This is the if statement that is used to determine if the group exists in Active Directory##

 if($verifygroupexists -eq $null)

 {

 ##If the group doesnt exist, create a file and output the string to the file stating so with the group name##

 ##Still working on the removing portion of this, need help##

 New-Item $fullpath -ItemType file;

 [string]$error='AD Group'+' '+$name+' '+'does not exist';

 $error | Out-File -filepath $Fullpath;

 $Removeentry=$name;

 $name.Remove($Removeentry);

 }  

 else

 {

 ##If the group does exist in Active Directory then create a new text file to be used for output.

 New-Item $fullpath -ItemType file;

       ##Get the list of memebrs in the group and place them into a new variable##

 $groupmember=get-adgroupmember -Identity $name;

              ##Now loop through each entry in the new variable and output to the text file each member's 'name' (A.K.A. Displayname)##

 foreach ($user in $groupmember)

 {


              ##This is where my issue is, its not outputting all of the names to the text file##

             $displayname=get-aduser -identity $User.SamAccountName | select name | Out-File -filepath $Fullpath; 


              };



         };


 }; 

Например, вывод всегда выглядит так:

имя

Фамилия, Имя1

Когда должно быть:

имя

Фамилия, Имя1

Фамилия, Имя2

Фамилия, Имя3

Фамилия, Имя4

Фамилия, Имя5

и т.д, и т.д, и т.д.


person SprJD7903    schedule 27.03.2018    source источник
comment
почему скрипт выводит только одно имя в файл, когда он должен выводить 300+ для каждой группы. - потому что код говорит перезаписать файл, выводя одного пользователя. Вам нужно передать весь вывод в out-file, а не по одной строке за раз. Или используйте add-content, чтобы избежать перезаписи.   -  person TessellatingHeckler    schedule 28.03.2018
comment
@TessellatingHeckler Как передать ВСЕ выходные данные в файл? Я думал, что уже делаю это.   -  person SprJD7903    schedule 28.03.2018
comment
$things | foreach-object { ... } | out-file направляет все объекты в один файл вместо $things | foreach-object { ...| out-file }, который направляет каждый объект в новый файл (перезаписывая предыдущий файл).   -  person TessellatingHeckler    schedule 28.03.2018


Ответы (1)


Эта строка вызывается для каждого пользователя в группе и при каждом запуске перезаписывает содержимое файла.

$displayname=get-aduser -identity $User.SamAccountName | select name | Out-File -filepath $Fullpath;

Если вы замените Out-File на Add-Content, команда будет добавлена ​​в файл. Если вы запускаете скрипт повторно, обязательно используйте Set-Content, чтобы сначала очистить файл. Вам также не нужно устанавливать значение переменной $displayname как часть этого шага:

Set-Content -Value "" -Path $Fullpath
get-aduser -identity $User.SamAccountName | select name | Add-Content -Path $Fullpath;
person mjsqu    schedule 27.03.2018
comment
Хорошо, теперь все имена передаются в текстовые файлы, спасибо, что помогли мне с этим, но теперь он выходит в другом формате. Вместо следующего: имя Фамилия, Имя1 Фамилия, Имя2 Фамилия, Имя3 Фамилия, Имя4 Фамилия, Имя5 теперь будет выглядеть так: @{name=Last, Name1} @{name=Last, Name2} @{name= Фамилия, Имя3} Почему это так и как это исправить? - person SprJD7903; 28.03.2018
comment
ОК, я разделил строку, чтобы очистить вывод до желаемого результата. - person SprJD7903; 28.03.2018