如何使用PowerShell读取txt用户列表查询AD账号启用状态
故障原因
注意:Get-ADUser本身原生支持管道传参,之前无输出完全是写法问题,和所谓「ADUser无法适配管道传参」的传言无关,具体问题点如下:
- 属性匹配逻辑错误:源文件存储的是UserPrincipalName格式账号,但过滤条件用
name -like "$_"匹配Name属性(AD账号的名称字段,和UPN完全不对应),无法命中任何用户。 - 输入数据未清洗:
gc(Get-Content别名)读取文本时会保留每行首尾空白字符、文件末尾空行,传入空值/带多余字符的值查询AD时不会返回结果,也不会抛出显性报错。 - 过滤语句变量展开失效:单引号包裹的过滤条件中
$_不会被替换为当前循环的用户值,实际执行的过滤条件为空。 - 冗余参数拉低效率:
-properties *会拉取AD账号的上百个全量属性,实际你只需要2个字段,无意义拖慢查询速度。
可直接运行的单行命令
适配你习惯的短别名写法,直接复制到PowerShell运行即可,结果会以弹窗表格形式展示:
gc .\users.txt | foreach { $_.Trim() } | ? { $_ } | foreach { get-aduser -server "corp.xxx.com" -f "UserPrincipalName -eq '$_'" -properties DisplayName } | select displayname,enabled | Out-GridView
命令各段逻辑说明:
$_.Trim():清除每行首尾的空格、换行符等隐形脏字符? { $_ }:过滤掉文本中的空行,避免无效查询- 过滤条件改为匹配
UserPrincipalName属性,用精确匹配-eq替代模糊匹配-like,查询效率更高 - 仅拉取需要的
DisplayName属性,替代全量属性拉取 - 若需要把结果导出为CSV文件,可把末尾的
| Out-GridView替换为| Export-Csv .\AD账号状态结果.csv -Encoding UTF8 -NoTypeInformation
带异常标记的进阶版本
如果需要标记出查询不到的账号,避免漏查,可以运行以下版本,结果会自动导出为CSV文件,查无记录的账号会标注「未找到对应用户」:
gc .\users.txt | foreach { $_.Trim() } | ? { $_ } | foreach { $currentUpn = $_ try { get-aduser -server "corp.xxx.com" -f "UserPrincipalName -eq '$currentUpn'" -properties DisplayName | select DisplayName,Enabled,@{Name="查询的UPN";Expression={$currentUpn}} } catch { [PSCustomObject]@{ DisplayName = "未找到对应用户" Enabled = "查询失败" 查询的UPN = $currentUpn } } } | Export-Csv .\AD账号状态结果.csv -Encoding UTF8 -NoTypeInformation
运行前提:当前设备已安装RSAT Active Directory域服务工具,且你使用的账号对目标域有AD查询权限。
内容的提问来源于stack exchange,提问作者Ozgur Bulent Koza
相关产品推荐
相关产品推荐

