如何用PowerShell的LDAP筛选器查找近12个月的活跃AD用户
问题分析与修正方案
你的核心问题是LDAP筛选器中使用了PowerShell计算属性而非AD原生LDAP属性,导致语法无效。以下是具体修正步骤和完整脚本:
关键错误点
LastLogonDate是Get-ADUser返回的计算属性,并非AD存储的原生LDAP属性,LDAP筛选器无法直接识别它,需替换为AD原生属性lastLogonTimestamp(支持跨域控制器同步,适合全域查询)或lastLogon(仅存储在用户最近登录的DC,不建议全域使用)。- 可选但推荐:活跃用户通常是启用状态,建议在筛选器中补充排除禁用用户的条件。
修正后的完整脚本
# 计算1年前的UTC时间,转换为LDAP要求的格式 $oneYearAgoUtc = [datetime]::UtcNow.AddYears(-1) $ldapDateFormat = $oneYearAgoUtc.ToString("yyyyMMddHHmmss.0Z") # 构建正确的LDAP筛选器 $filter = @" (& # 近12个月内有属性修改记录 (whenChanged>=$ldapDateFormat) # 近12个月内有登录记录(使用跨DC同步的lastLogonTimestamp) (lastLogonTimestamp>=$ldapDateFormat) # 筛选启用状态的用户(排除禁用标记) (!userAccountControl:1.2.840.113556.1.4.803:=2) ) "@ # 定义需要获取的用户属性 $properties = @( 'displayName', 'title', 'department', 'DistinguishedName', 'mail', 'lastLogonDate', 'Enabled', 'lockedOut', 'whenChanged', 'AccountExpirationDate', 'UserAccountControl', 'sAMAccountType', 'whenCreated' ) $Filename = "BJL Active Users.csv" # 执行AD查询,lastLogonDate会由PowerShell自动从lastLogonTimestamp转换为DateTime格式 $result = Get-ADUser -LDAPFilter $filter -Properties $properties | Select-Object $properties # 导出结果 $result | Export-Csv -Path "$ExportPath$Filename" -NoTypeInformation $result | Out-GridView -Title 'Active Accounts'
额外说明
- 关于
lastLogonTimestamp:该属性会在域控制器间同步,误差不超过14天(AD默认同步间隔),足以满足大部分全域活跃用户查询需求;若需要精确到秒的登录时间,需遍历所有域控制器查询lastLogon属性并合并结果,但这种场景极少。 - 权限要求:确保执行脚本的账号拥有AD用户属性的读取权限,否则会出现查询结果不全或报错的情况。
内容的提问来源于stack exchange,提问作者Ian W
相关产品推荐
相关产品推荐

