PowerShell脚本来计算多个组的成员而不重复
Posted
技术标签:
【中文标题】PowerShell脚本来计算多个组的成员而不重复【英文标题】:PowerShell script to count members of multiple groups without duplicates 【发布时间】:2021-11-06 09:20:07 【问题描述】:我需要编写一个 PowerShell 脚本来统计 4 个组中的用户: 第 1 组 组2 组3 组4
如果用户在多个组中,脚本需要跳过重复项。
以前我使用以下脚本分别计算每个组中的用户,但它包含重复项,我需要准确计算所有组中的用户。
$ADInfo = Get-ADGroup -Identity '<groupname>' -Properties Members
$ADInfo.Members |Where-Object (Get-ADUser $_ -Properties extensionAttribute4).extensionAttribute4 -eq 'o365_facstaff' |Select -Unique | Measure-Object
【问题讨论】:
【参考方案1】:您可以调整它以将集合发送到管道中。像下面这样的东西应该可以工作:
$Groups = 'Group1','Group2','Group3','Group4'
$Groups |
Get-ADGroup -Properties Member |
Where-Object (Get-ADUser $_ -Properties extensionAttribute4).extensionAttribute4 -eq 'o365_facstaff' |
Select-Object -Unique |
Measure-Object
但是,我可能会有所不同:
$Groups = 'Group1','Group2','Group3','Group4'
$Groups |
Get-ADGroupMember |
Where-Object $_.objectCLass -eq 'user' |
Get-ADUser -Properties extensionAttribute4 |
Where-Object $_.extensionAttribute4 -eq 'o365_facstaff' |
Select-Object -Unique |
Measure-Object
注意:在您的原始代码中,如果您将Get-ADUser
命令发送给一个组,它可能会出错,因为组可以是其他组的成员。这就是为什么在上面的示例中有一个额外的Where
子句来仅查找 objectClass 'user'。
如果您想弄乱组专有名称,您也可以尝试使用 LDAP 过滤器:
$Groups = @(
'Group1_DN'
'Group2_DN'
'Group3_DN'
'Group4_DN'
)
$LDAPFilter = "(&(extensionAttribute4=o365_facstaff)(|(memberOf=0)(memberOf=1)(memberOf=2)(memberOf=3)))" -f $Groups
Get-ADUser -LDAPFilter $LDAPFilter |
Select-Object -Unique |
Measure-Object
这将返回 extensionAttribute4 为 'o365_facstaff' 且属于任意 4 个组的所有用户。然后它将像以前一样通过Select -Unique
& Measure-Object
。
注意:在这种情况下,性能可能不是一个重要因素。但是,最好的做法是在命令中向左移动过滤,而不是使用 Where
子句或其他辅助处理进行后过滤。在这种情况下,利用 cmdlet 的内置过滤参数。
【讨论】:
以上是关于PowerShell脚本来计算多个组的成员而不重复的主要内容,如果未能解决你的问题,请参考以下文章
powershell 此脚本获取Active Directory组的成员
powershell PowerShell函数,用于列出本地组的成员,例如Administrators。