如何筛选并显示Active Directory中已启用用户的详细信息
问题描述
编写了一段PowerShell脚本用于查询Active Directory(AD)用户的启用/禁用状态,需求是仅显示状态为已启用(True)的用户详细信息。当前使用的脚本如下:
$outputs = Get-Content -Path C:\Users\dcsysad\Desktop\BulkUserPasswordReset.csv |ForEach-Object{ Get-ADUser -LDAPFilter "(samaccountname=$_)" |Select-Object -Property samaccountname,enabled} If ($outputs.enabled -like "True"){ Write-Output $outputs }
当前运行输出无法正确过滤,会包含禁用用户,不符合需求。
解决方案
问题核心是对集合对象的判断逻辑错误:$outputs是多用户对象的集合,直接用$outputs.enabled -like "True"会导致PowerShell处理数组匹配时逻辑失效,无法精准过滤。
方法一:查询阶段直接筛选(性能更优)
通过LDAP过滤器直接仅查询已启用用户,减少不必要的数据返回:
Get-Content -Path C:\Users\dcsysad\Desktop\BulkUserPasswordReset.csv | ForEach-Object { # LDAP过滤器同时匹配用户名和已启用状态 Get-ADUser -LDAPFilter "(& (samaccountname=$_) (!userAccountControl:1.2.840.113556.1.4.803:=2))" | Select-Object -Property samaccountname, enabled }
注:
!userAccountControl:1.2.840.113556.1.4.803:=2是LDAP的按位匹配语法,用于排除userAccountControl属性中包含禁用标识(值为2)的用户,即仅返回已启用账号。
方法二:结果集合后过滤
如果需要先获取所有用户再筛选,使用Where-Object处理集合:
$outputs = Get-Content -Path C:\Users\dcsysad\Desktop\BulkUserPasswordReset.csv | ForEach-Object { Get-ADUser -LDAPFilter "(samaccountname=$_)" | Select-Object -Property samaccountname, enabled } # 精准过滤enabled属性为$true的用户 $outputs | Where-Object { $_.enabled -eq $true }
两种方法都能实现仅显示已启用AD用户的需求,推荐方法一,因为它在AD查询阶段就完成筛选,效率更高。
内容的提问来源于stack exchange,提问作者Arunkumar
相关产品推荐
相关产品推荐

