如何通过姓名或 SamAccountName 获取广告组成员

How to get-adgroup members by their Name or SamAccountName

我想从包含成员和安全组的 AD 组中提取成员。

Example, Group_A:
User1
User2
User3
Group_B

当我 运行 我的脚本时,它显示:

CN=User1,OU=Users,DC=Contoso,DC=com CN=User2,OU=Users,DC=Contoso,DC=com CN=User3,OU=Users,DC=Contoso,DC=com CN=Group_B,OU=Users,DC=Contoso,DC=com

是否有其他方式显示他们的姓名 and/or SamAccountname?

$Groups = 
@"
GroupNames;
Group_A
"@ | ConvertFrom-Csv -Delimiter ';'



$ADGroups = 
Foreach ($Group in $Groups){ 
Get-ADGroup $Group.GroupNames -Server contoso.com -Properties Members }

$ADGroups.Members

如其他有用的答案所示,如果您想安全起见,可以使用 Get-ADGroupMember 获取组成员资格,这也很有用,因为您可以区分 ObjectClass 每个成员。

您还可以按照 this Q&A.

对 AD 组的 member 属性的元素 (distinguishedName) 进行字符串操作

如果该组的成员在不同的域中,这应该可以工作,但很可能会很慢。

foreach($group in $groups) {
    $membership = Get-ADGroup $Group -Properties Member
    $membership.Member | Group-Object { ($_ -split '(?=DC=)',2)[1] } |
    ForEach-Object {
        [adsi]$ldap = 'LDAP://{0}' -f $_.Name
        [string]$domain = $ldap.Name

        foreach($member in $_.Group) {
            $obj = Get-ADObject $member -Server $domain
            [pscustomobject]@{
                MemberOf       = $membership.Name
                Domain         = $domain
                SamAccountName = $obj.SamAccountName
                ObjectClass    = $obj.ObjectClass
            }
        }
    }
}

Get-ADGroupMember 有两个参数可供您使用。 samaccountname 和名称。

只需执行以下操作:

Get-ADGroupMember -identity $ADGroup | select-object SamAccountName, Name

或者在您的代码片段中:

Foreach ($group in $groups) {
Get-AdGroup -identity $group | select-object Samaccountname, Name }

当然你可以添加:

Get-AdGroup -identity $group | select-object Samaccountname, Name | export-csv C:\mypath\report.csv

您可以 运行 使用 Get-ADObject 对返回值进行查询,因为它接受 DistinguishedNames 作为值并且不受对象限制 class:

foreach ($Group in $Groups)
{ 
    (Get-ADGroup $Group.GroupNames -Server contoso.com -Properties Members).Members | 
        ForEach-Object -Process {
            Get-ADObject -Identity $_ -Properties DisplayName | Select-Object -Property DisplayName
        }     
}

...或者,您可以在所需条目处拆分结果:

foreach ($Group in $Groups)
{ 
    (Get-ADGroup $Group.GroupNames -Server contoso.com -Properties Members).Members | 
        ForEach-Object -Process {
            $_.Split(',',2).Split("=")[1]
        }     
}

免责声明我的系统上没有安装 AD 模块,所以我无法确认这是否是我所需要的全部.

最简单的方法是扩展 成员 属性 和 Get-ADGroup,然后将其通过管道传输到 Get-ADUser

$adUsers = Foreach ($Group in $Groups) {
    Get-ADGroup $Group.GroupNames -Server contoso.com -Properties Members | Select-Object -ExpandProperty Members | Get-aduser
}