You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:29:34