使用含姓名的文本文件通过PowerShell检查AD用户账户启用状态
解决PowerShell通过用户全名查询AD账户启用状态的问题
你完全猜对了问题根源!你的代码报错是因为过滤条件和文本文件里的内容不匹配——文本里是用户的全名(名+姓),但你用了samaccountname(AD里的登录用户名,比如jsmith)来过滤,这两个属性完全不是一回事,自然查不到对应账户。
下面给你两种可行的修正方案,根据你的AD环境选择即可:
方案1:通过显示名称(Display Name)匹配
如果你的AD用户的"显示名称"就是文本里的全名格式(比如"John Smith"),直接用displayname属性过滤最方便:
Get-Content -Path users.txt | ForEach-Object { # 清理每行文本的首尾空白,避免格式干扰 $fullName = $_.Trim() # 用displayname匹配AD用户,返回账号名和启用状态 Get-ADUser -LDAPFilter "(displayname=$fullName)" | Select-Object -Property samaccountname, enabled, displayname }
我额外把displayname加入了返回结果,方便你核对查询到的用户是不是目标对象,避免重名导致的错误。
方案2:拆分名和姓分别匹配
如果AD里的显示名称格式和文本不一致(比如是"Smith, John"),可以把全名拆分成名(givenname)和姓(sn)组合查询:
Get-Content -Path users.txt | ForEach-Object { $fullName = $_.Trim() # 按空格分割全名成名和姓(支持姓里带空格的情况,比如"Mary van der Saar") $nameParts = $fullName -split '\s+', 2 $givenName = $nameParts[0] $surName = $nameParts[1] # 组合名和姓的LDAP过滤条件 Get-ADUser -LDAPFilter "(&(givenname=$givenName)(sn=$surName))" | Select-Object -Property samaccountname, enabled, givenname, sn }
额外注意事项
- 确保运行这段PowerShell的账户拥有读取AD用户属性的权限,否则会返回权限不足的错误
- 如果全名里包含特殊字符(比如
&、(、)),需要对LDAP过滤器进行转义,不过一般日常的全名格式不需要额外处理 - 可以先手动执行
Get-ADUser -Filter {displayname -eq "你的测试用户名"}验证单个用户的属性是否匹配,确保过滤逻辑正确
内容的提问来源于stack exchange,提问作者Alex S
相关产品推荐
相关产品推荐

