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。

powershell 是AD组的用户成员

Powershell 将User组的成员复制到新组中去

SQLServer用powershell实现多台服务器批量执行SQL脚本

将多个数组合并为一个数组而不重复[重复]