PowerShell查询AD用户时LastLogon日期一致且LastLogonTimestamp无结果
AD用户登录属性查询问题解决
问题原因
- LastLogon显示相同日期:LastLogon是域内非复制属性,仅记录用户在当前查询的域控制器(DC)上的登录时间。如果多数用户没在这台DC登录过,该属性会返回默认初始值(比如1601年1月1日),导致所有用户显示同一日期。
- LastLogonTimestamp无结果:这个属性是可复制的,但如果用户从未登录过域,或者登录后还没触发AD复制周期,属性值为空。直接对空值执行
FromFileTime转换会导致无结果甚至报错。
修正后的查询命令
# 获取域内所有域控制器 $domainControllers = Get-ADDomainController -Filter * | Select-Object -ExpandProperty Name # 遍历每台DC收集用户登录数据 $allUserLogons = foreach ($dc in $domainControllers) { Get-AdUser -Filter * -Properties DisplayName, LastLogon, LastLogonTimestamp -Server $dc | Select-Object DisplayName, @{Name='LastLogon'; Expression={if ($_.LastLogon -ne 0) {[DateTime]::FromFileTime($_.LastLogon)} else {$null}}}, LastLogonDate, @{Name='LastLogonTimestamp'; Expression={if ($_.LastLogonTimestamp -ne 0) {[DateTime]::FromFileTime($_.LastLogonTimestamp).ToString('d MMMM')} else {$null}}} } # 按用户分组,保留每个用户最新的LastLogon记录 $allUserLogons | Group-Object DisplayName | ForEach-Object { $_.Group | Sort-Object LastLogon -Descending | Select-Object -First 1 }
关键说明
- 遍历所有DC:确保收集到用户在任意一台服务器上的登录记录,避免遗漏真实登录时间
- 空值判断:过滤掉未登录用户的0值属性,避免显示错误的初始日期
- 取最大值:同一用户在多台DC的登录记录中,保留最新的那条,得到真实最后登录时间
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

