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

如何用PowerShell跨多域查询CSV列表中用户账号的禁用状态?

跨多域查询AD用户状态的实现方法

Get-ADUser的-Server参数不支持直接传入数组,必须逐个指定域控制器/域名。嵌套循环是最直接的解决方案,不过可以通过优化写法让代码更高效易读。

优化后的脚本示例

Import-Module ActiveDirectory
$csvPath = "C:\temp\Users.csv"
$csv = Import-Csv -Path $csvPath
$domainControllers = @("D01", "D02", "D03", "D04", "D05")

# 遍历CSV中的每个用户
foreach ($user in $csv) {
    $firstName = $user.FirstName
    $lastName = $user.LastName

    # 遍历每个域控制器,跨域查询
    foreach ($dc in $domainControllers) {
        try {
            # 查询用户,添加域控制器信息到结果
            Get-ADUser -Filter "GivenName -eq '$firstName' -and Surname -eq '$lastName'" `
                -Server $dc `
                -Properties DisplayName, EmployeeID, Enabled `
                | Select-Object DisplayName, EmployeeID, Enabled, @{Name='DomainController'; Expression={$dc}}
        }
        catch {
            # 处理用户不存在或连接失败的情况,可选输出提示
            Write-Warning "在域控制器 $dc 中未找到用户 $firstName $lastName,或连接失败:$_"
        }
    }
}

关键优化点说明

  • 避免使用-Properties *:只查询需要的属性(DisplayName, EmployeeID, Enabled),减少数据传输,提升效率。
  • 字符串格式的Filter:相比脚本块Filter,字符串Filter在循环中更稳定,避免变量解析问题。
  • 错误处理:用try/catch捕获查询失败的情况,防止脚本因单个域查询出错而中断,同时输出警告信息便于排查。
  • 添加域标识:通过计算属性DomainController,明确显示用户来自哪个域,方便后续结果分析。

更简便的替代思路(可选)

如果你的环境中存在全局编录服务器,可以直接查询全局编录,无需遍历所有域控制器:

# 假设全局编录服务器为GC01,端口默认3268
Get-ADUser -Filter "GivenName -eq '$firstName' -and Surname -eq '$lastName'" `
    -Server "GC01:3268" `
    -Properties DisplayName, EmployeeID, Enabled `
    | Select-Object DisplayName, EmployeeID, Enabled, @{Name='Domain'; Expression={$_.DistinguishedName -split ',' | Where-Object {$_ -match 'DC='} -join '.' -replace 'DC='}}

全局编录包含所有域的用户信息,一次查询即可覆盖所有域,但需要确保你的账号有全局编录的查询权限,且全局编录服务器可正常访问。

内容的提问来源于stack exchange,提问作者John K.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 05:03:24