阵列中每个用户的Powershell列表组名称

时间:2018-09-24 20:27:25

标签: powershell active-directory

我想为数组中的每个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 :(得分:1)

看起来您已经弄混了这两个变量: $ 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

答案 1 :(得分:0)

Kirill Pashkov's helpful answer解决了您眼前的问题。

要退后一步:

您的症状表明您正在运行 PSv2 ,这具有以下含义:

  • 成员枚举(PSv3 +)不可用;也就是说,如果$ADuser array (一个集合),则不能使用.memberOf隐式收集其 elements < / em>。

  • 即使要枚举的值为.memberOfforeach (...) { ... }循环也会执行其循环主体-在PSv3 +中,根本不执行循环主体。


也就是说,您的代码可以简化为这一命令

$null