首页 > 解决方案 > 通过 powershell 获取每个用户成员的规范名称

问题描述

我也想获得每个组的规范名称。我怎样才能做到这一点 ?

这是我的脚本:

Get-ADUser -Filter {Enabled -eq $true}  -Properties * | Select displayname ,@{Name="MemberOf";Expression={($_.MemberOf | %{(Get-ADGroup $_).sAMAccountName}) -Join ";"}} | Export-Csv -Path "c:\temp\users.csv" -NoTypeInformation -Encoding UTF8 

我的输出:

"displayname","MemberOf"
"User01","Group01;Group02;Group03"

我想要的输出:

"displayname","MemberOf"
"User01","Group01;Contoso.com/OU1/OU2;Group02;Contoso.com/OU21/OU52;Group03;Contoso.com/OU1/OU21/OU22"

标签: powershell

解决方案


我同意Mathias的观点,但这是使用已有代码的方法。绝对建议您只调用您需要查询的属性。

Get-ADUser -Filter {Enabled -eq $true} -Properties Displayname,MemberOf |
Select-Object Displayname,
@{
    Name="MemberOf"
    Expression={
        # ($_.MemberOf | ForEach-Object{
        #    (Get-ADGroup $_ -Properties CanonicalName).CanonicalName
        # }) -Join ";"
    
        # You can pipe $_.MemberOf to Get-ADGroup, since it's an array of 
        # distinguishedNames it should work fine
        ($_.MemberOf | Get-ADGroup -Properties CanonicalName).CanonicalName -Join ";"    
    }
} | Export-Csv -Path "c:\temp\users.csv" -NoTypeInformation -Encoding UTF8

该代码的替代方案,使用更经典的方法:

$users = Get-ADUser -Filter {Enabled -eq $true} -Properties DisplayName

$result = foreach($user in $users)
{
    $params = @{
        LDAPFilter = "(member=$($user.DistinguishedName))"
        Properties = "CanonicalName"
    }
    $membership = (Get-ADGroup @params).CanonicalName -join ";"

    [pscustomobject]@{
        DisplayName = $user.DisplayName
        MemberOf = $membership
    }
}

$result | Export-Csv -Path "c:\temp\users.csv" -NoTypeInformation -Encoding UTF8

推荐阅读