PowerShell脚本需求:递归检查组成员、修正脚本及筛选特定前缀用户
解决方案:递归组成员检查、特定前缀用户获取及原脚本优化
针对你遇到的无法检测嵌套组递归成员的问题,以及另外两个需求,我整理了实用的PowerShell脚本方案:
1. 检查特定用户是否属于某组(包含递归成员关系)
如果要验证用户是否是某个组的嵌套成员(比如用户在Group2,Group2又在Group1),最高效的方法是利用LDAP的递归匹配规则(1.2.840.113556.1.4.1941),不需要手动遍历所有父组:
# 定义目标用户和组匹配模式 $targetUser = "tester4" $groupPattern = "Metalogix*" # 先获取所有符合模式的组 $matchingGroups = Get-ADGroup -Filter { Name -like $groupPattern } foreach ($group in $matchingGroups) { # 使用LDAP递归过滤器检查用户是否属于该组(含嵌套) $isRecursiveMember = Get-ADUser -Filter "(memberof:1.2.840.113556.1.4.1941:=$($group.DistinguishedName))" ` -Identity $targetUser -ErrorAction SilentlyContinue if ($isRecursiveMember) { Write-Host "✅ $targetUser 是 $($group.Name) 的递归成员" } else { Write-Host "❌ $targetUser 不是 $($group.Name) 的递归成员" } }
如果你只想确认用户是否属于任意匹配模式的组(不用逐个检查),可以简化成:
$targetUser = "tester6" $groupPattern = "Metalogix*" # 获取用户的所有递归所属组,然后匹配模式 $allUserGroups = Get-ADUser -Identity $targetUser -Properties memberof | Select-Object -ExpandProperty memberof | ForEach-Object { Get-ADGroup $_ -Properties memberof } | Select-Object Name, memberof -Unique | # 递归获取所有父组 ForEach-Object { $_; Get-ADGroup $_.memberof -Properties memberof } | Select-Object Name -Unique $hasMatchingGroup = $allUserGroups | Where-Object { $_.Name -like $groupPattern } if ($hasMatchingGroup) { Write-Host "$targetUser 属于匹配 $groupPattern 的组(含嵌套)" } else { Write-Host "$targetUser 不属于任何匹配 $groupPattern 的组" }
2. 获取所有samaccountname以"STR"为前缀的用户
这个需求很直接,用Get-ADUser的过滤器就能快速实现,还可以导出到CSV方便后续处理:
# 获取所有samaccountname以STR开头的AD用户,包含必要属性 $strPrefixedUsers = Get-ADUser -Filter { sAMAccountName -like "STR*" } ` -Properties Name, PrimarySmtpAddress, EmailAddress # 导出到CSV文件 $strPrefixedUsers | Select-Object Name, sAMAccountName, PrimarySmtpAddress, EmailAddress | Export-Csv -Path "C:\STR_Prefixed_Users.csv" -NoTypeInformation -Encoding UTF8 # 控制台输出结果 Write-Host "已获取 $($strPrefixedUsers.Count) 个samaccountname以STR开头的用户,已导出到C:\STR_Prefixed_Users.csv"
3. 优化原脚本:列出拥有邮箱但不属于Metalogix*组(含递归)的用户
针对你原脚本只能检测直接组成员的问题,我优化了脚本,加入递归成员检测逻辑,确保不会漏掉嵌套组的情况:
# 导入必要模块(如果是Exchange Online,用ExchangeOnlineManagement) Import-Module ActiveDirectory Import-Module ExchangeManagementShell # 本地Exchange环境,Exchange Online请替换为ExchangeOnlineManagement # 获取所有邮箱用户 $allMailboxUsers = Get-Mailbox -ResultSize Unlimited # 获取所有名称匹配Metalogix*的组 $metalogixGroups = Get-ADGroup -Filter { Name -like "Metalogix*" } # 初始化结果数组 $nonMemberUsers = @() foreach ($user in $allMailboxUsers) { $isInMetalogixGroup = $false # 遍历每个Metalogix组,检查用户是否是递归成员 foreach ($group in $metalogixGroups) { $checkMember = Get-ADUser -Filter "(memberof:1.2.840.113556.1.4.1941:=$($group.DistinguishedName))" ` -Identity $user.sAMAccountName -ErrorAction SilentlyContinue if ($checkMember) { $isInMetalogixGroup = $true break # 只要属于一个匹配组,就跳出循环 } } if (-not $isInMetalogixGroup) { # 收集用户邮箱信息 $userDetails = Get-Mailbox -Identity $user.sAMAccountName | Select-Object Name, sAMAccountName, PrimarySmtpAddress, Database $nonMemberUsers += $userDetails Write-Host "$($user.sAMAccountName) 不属于任何Metalogix*组(含嵌套)" } } # 导出结果到CSV $nonMemberUsers | Export-Csv -Path "C:\Non_Metalogix_Mailbox_Users.csv" -NoTypeInformation -Encoding UTF8 Write-Host "已完成检测,共找到 $($nonMemberUsers.Count) 个符合条件的用户,结果已导出"
注意事项
- 运行脚本需要Active Directory模块和Exchange模块/Exchange Online模块的权限;
- 如果是Exchange Online环境,需要先运行
Connect-ExchangeOnline连接到租户; - LDAP递归过滤器(
memberof:1.2.840.113556.1.4.1941:)只适用于AD,不适用于其他目录服务。
内容的提问来源于stack exchange,提问作者Arbelac
相关产品推荐
相关产品推荐

