PowerShell脚本计算多个组的成员,没有重复



我需要写一个PowerShell脚本,将用户分为4组:group1group2group3group4

如果用户在多个组中,脚本需要跳过重复项。

以前我使用下面的脚本分别计算每个组中的用户,但它包括重复的,我需要所有组的准确用户计数。

$ADInfo = Get-ADGroup -Identity '<groupname>' -Properties Members
$ADInfo.Members |Where-Object {(Get-ADUser $_ -Properties extensionAttribute4).extensionAttribute4 -eq 'o365_facstaff'} |Select -Unique | Measure-Object

您可以调整它以发送一个集合。像下面这样的代码应该可以工作:

$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命令发送一个组,则CC_1命令可能会出错,因为组可以是其他组的成员。这就是为什么在上面的例子中有一个额外的Where{}子句来只查找objectClass 'user'。

如果您想打乱组Distinguished Names,您也可以尝试使用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&

注意:在这种情况下,性能可能不是一个重要因素。然而,最好的做法是在命令中向左移动过滤,而不是使用Where{}子句或其他二次处理进行后过滤。在本例中,利用cmdlet的内置过滤参数。

最新更新