Имена групп списка Powershell для каждого пользователя в массиве - PullRequest
0 голосов
/ 24 сентября 2018

Я хочу вернуть имена групп в списке через точку с запятой для каждого пользователя AD в массиве.Вот что у меня есть:

$ADuser = Get-ADUser -filter * -Properties * | ? {$_.employeeNumber -eq " 9408" -or $_.employeeNumber -eq "3816"} | Select-Object Name,SamAccountName,UserPrincipalName,DisplayName,GivenName,Surname,description,mail,Enabled,HomeDirectory,distinguishedname,MemberOf

foreach($user in $ADuser)
{

    $Groups = forEach ($group in $ADuser.memberOf)
    {
        (Get-ADGroup $group).name
    }

    $groupStr = $Groups -join ";"

    $ADuser = $ADuser | Select-Object Name,SamAccountName,UserPrincipalName,DisplayName,GivenName,surname,description,mail,Enabled,HomeDirectory,distinguishedname,@{n='Groups';e={$groupStr}}
}

Этот код отлично работает, когда $ADuser содержит одного пользователя.Когда $ADuser содержит более одного пользователя, я получаю следующую ошибку каждый раз, когда он пытается установить Groups:

Get-ADGroup : Cannot validate argument on parameter 'Identity'. The argument is null. Provide a valid value for the argument, and then try running the command again.
At line:8 char:22
+         (Get-ADGroup $group).name
+                      ~~~~~~
+ CategoryInfo : InvalidData: (:) [Get-ADGroup], 
ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.GetADGroup 

Я ожидаю, что выходные данные будут такими для каждого $ADuser:

Name              : John.Doe
SamAccountName    : John.Doe
UserPrincipalName : John.Doe@mydomain.com
DisplayName       : John Doe
GivenName         : John
Surname           : Doe
description       : Joe is a person
mail              : John.Doe@mydomain.com
Enabled           : True
HomeDirectory     : \\fileserver\homefolders\John.Doe
distinguishedname : CN=John.Doe,OU=People,OU=my,DC=domain
Groups            : Group1;Group2;Group3;Group4

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Полезный ответ Кирилла Пашкова решает вашу непосредственную проблему.

Чтобы сделать шаг назад:

Ваши симптомы говорят о том, что вы работаете на PSv2 , что имеет следующие последствия:

  • Перечисление членов (PSv3 +) недоступно;то есть, если $ADuser является массивом (коллекцией), вы не можете использовать .memberOf для неявного сбора значений свойств .memberOf его элементов .

  • Цикл foreach (...) { ... } выполняет свое тело цикла, даже если перечисляемое значение равно $null - в PSv3 + тело цикла вообще не выполняется.


Тем не менее, ваш код может быть сокращен до этой одной команды :

Get-ADUser -Properties * |
  ? {$_.employeeNumber -eq " 9408" -or $_.employeeNumber -eq "3816"} | 
    Select-Object Name, 
      SamAccountName,
      UserPrincipalName,
      DisplayName,       
      GivenName,
      Surname,
      description,
      mail,
      Enabled,
      HomeDirectory,
      distinguishedname,
      @{ 
        n='Groups';
        e={ ($_.memberOf | Get-AdGroup | Select-Object -ExpandProperty Name) -join ";" } 
      }
0 голосов
/ 25 сентября 2018

Похоже, вы перепутали две эти переменные: $ ADUsers и $ users .

$ADuser = Get-ADUser -filter * -Properties * | ? {$_.employeeNumber -eq " 9408" -or $_.employeeNumber -eq "3816"} | Select-Object Name,SamAccountName,UserPrincipalName,DisplayName,GivenName,Surname,description,mail,Enabled,HomeDirectory,distinguishedname,MemberOf,Groups

    $Results = New-Object System.Collections.ArrayList

    foreach($user in @($ADuser))
    {

        $Groups = forEach ($group in @($user.memberOf))
        {
            (Get-ADGroup $group).name
        }
        $user.Groups = $Groups -join ';'
        [Void]$Results.Add($user)
    }

    $Results
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...