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

PowerShell查询AD测试用户:不同运行身份结果不一致问题排查

问题描述

我写了一个PowerShell脚本,用来遍历整个Active Directory,检测名称包含“test”的启用用户并触发告警。用普通域管理员身份运行PowerShell ISE能正常得到结果,但以管理员身份运行时却显示0条结果,不知道问题出在哪。脚本代码如下:

# Define the search criteria
$SearchString = "*test*"
$AccountStatus = "Enabled"


try {
   # Search for active users with "test" in their names
    $Users = Get-ADUser -Filter {SamAccountName -like $SearchString -and Enabled -eq $true} -Properties SamAccountName

    if ($Users.Count -gt 0) {
        # User accounts found
        Write-Host "Active user accounts found with 'test' in their names."
        Write-Host "Exiting with exit code 1."
        write-host '<-Start Result->'
        write-host "Alert=Test user exists"
        write-host '<-End Result->'
        #exit 1
    } else {
        # No user accounts were found
        Write-Host "No Active user accounts found with 'test' in their names."
        Write-Host "Exiting with exit code 0."
        write-host '<-Start Result->'
        Write-host "Alert=Healthy - Test user does NOT exist"
        write-host '<-End Result->'
       # exit 0
    }
} catch {
    # Error occurred during the search
    Write-Host "An error occurred while searching for user accounts."
    Write-Host "Exiting with exit code 1."
write-host '<-Start Result->'
        Write-host "Alert=Failed Parsing"
        write-host '<-End Result->'
    #exit 1
}
问题分析与解决方法

出现这种差异的核心原因通常是两种身份运行时的AD搜索上下文、变量解析或执行环境不同,以下是具体排查和解决方向:

1. 检查AD搜索范围差异

管理员身份运行时,PowerShell的AD搜索根(SearchBase)可能和普通域管理员身份不一致。比如本地管理员权限启动的ISE可能默认搜索范围局限于本地域控制器的特定OU,而非整个域。

验证方法:分别在两种身份下运行以下命令,对比返回的默认分区:

Get-ADDomain | Select-Object DefaultPartition

解决方法:在脚本中显式指定搜索根为整个域的默认分区,确保两种身份下搜索范围一致:

$domainRoot = (Get-ADDomain).DefaultPartition
$Users = Get-ADUser -Filter {SamAccountName -like $SearchString -and Enabled -eq $true} -Properties SamAccountName -SearchBase $domainRoot

2. 修正Filter参数的变量解析问题

Get-ADUser的-Filter参数用脚本块({})时,可能存在变量作用域解析异常——管理员身份下脚本块内的$SearchString可能没有正确读取到外部变量值,导致搜索条件失效。

解决方法:把Filter改成字符串形式,确保变量正确解析:

# 用字符串形式定义Filter,避免脚本块的作用域问题
$filterString = "SamAccountName -like '$SearchString' -and Enabled -eq `$true"
$Users = Get-ADUser -Filter $filterString -Properties SamAccountName

3. 检查PowerShell执行架构

如果你的系统同时安装了32位和64位PowerShell,普通域管理员和管理员身份启动的ISE可能分属不同架构,导致AD模块加载的上下文不同。

验证方法:分别在两种身份下运行以下命令,查看是否一致:

[Environment]::Is64BitProcess

解决方法:确保用相同架构的PowerShell ISE运行脚本——比如右键点击PowerShell ISE,选择“以管理员身份运行”时,明确选择64位版本(如果系统有区分)。

4. 增加调试输出定位问题

在脚本中加入调试信息,查看两种身份下的搜索参数是否一致:

# 增加调试输出
Write-Host "Current user: $([System.Security.Principal.WindowsIdentity]::GetCurrent().Name)"
Write-Host "Search filter: $filterString"
Write-Host "Search base: $domainRoot"

通过这些调试信息,可以直观对比两种身份下的搜索条件、范围是否一致,快速定位问题点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 21:02:00