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

如何用PowerShell检测多个AD用户的重复个人身份编号

解决AD用户重复个人身份编号的问题

先把你已有的查询结果存入变量,避免重复执行AD查询:

$users = Get-ADUser -Filter * -SearchBase "OU=X,DC=X,DC=X,DC=X" -Properties PersonalIdentityNumber | 
    Select-Object Name,PersonalIdentityNumber | 
    Where-Object {$_.PersonalIdentityNumber} | 
    Sort-Object -Property PersonalIdentityNumber

按你的需求:对比每个用户前后20个用户实现重复检查

使用for循环遍历用户列表,通过索引控制对比范围,同时处理边界避免越界:

# 初始化存储重复结果的数组
$duplicateResults = @()

for ($i = 0; $i -lt $users.Count; $i++) {
    $current = $users[$i]
    # 计算对比范围的起始/结束索引,确保不超出列表边界
    $start = [Math]::Max(0, $i - 20)
    $end = [Math]::Min($users.Count - 1, $i + 20)
    
    # 在范围内查找与当前用户编号相同的其他用户
    $matches = $users[$start..$end] | 
        Where-Object { $_.PersonalIdentityNumber -eq $current.PersonalIdentityNumber -and $_ -ne $current }
    
    if ($matches) {
        $duplicateResults += [PSCustomObject]@{
            当前用户 = $current.Name
            身份编号 = $current.PersonalIdentityNumber
            重复用户 = $matches.Name -join '、'
        }
    }
}

# 输出去重后的结果(避免同一组重复被多次记录)
$duplicateResults | Sort-Object 身份编号 -Unique | Format-Table -AutoSize

更高效的替代方案:使用分组直接找重复

其实排序后,重复的编号必然是连续或紧邻的,用Group-Object可以更高效地直接分组找出重复,性能比循环对比更好:

$users | Group-Object PersonalIdentityNumber | 
    Where-Object {$_.Count -gt 1} | 
    ForEach-Object {
        [PSCustomObject]@{
            身份编号 = $_.Name
            关联用户 = $_.Group.Name -join '、'
            重复次数 = $_.Count
        }
    } | Format-Table -AutoSize

这个方法无需手动控制对比范围,PowerShell内部会高效完成分组,结果更清晰,也不会遗漏任何重复项。

内容的提问来源于stack exchange,提问作者Vilhelm Fontell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 02:10:57