通过PowerShell获取AD计算机对象准确最后登录时间问题咨询
结论
lastLogon属性返回大整数格式是完全正常的现象,不属于查询错误。
原因说明
Active Directory对lastLogon属性的原生存储格式为Windows FileTime(64位大整数),数值代表从1601年1月1日00:00 UTC起累计的100纳秒间隔数,你查询结果中133000120204176004就是该属性的原生存储值。
你现有脚本中已经通过[datetime]::FromFileTime($_.LastLogon)做了格式转换,返回结果里的LastLogonDate字段就是转换后人类可读的标准时间格式。
现有脚本逻辑说明
你目前遍历所有域控制器、取每个计算机对象最大lastLogon值的思路是正确的:lastLogon属性默认不会在域控制器之间做复制,每台DC只会存储自身认证过的对象的最后登录时间,只有遍历所有DC取最大值,才能拿到域内计算机最准确的最后登录时间。
脚本存在的小问题及修正
你现有脚本的字典判断逻辑存在空引用bug:第一次遍历到某台计算机时,字典中不存在对应键值,直接访问.lastLogonDate属性做比较会触发报错。将循环内的判断逻辑替换为以下代码即可修复:
foreach($computer in $computerList) { $currentSam = $computer.samAccountName # 无记录直接存入,有记录则比较后保留时间更新的条目 if(-not $logons.ContainsKey($currentSam) -or $logons[$currentSam].LastLogonDate -lt $computer.LastLogonDate) { $logons[$currentSam] = $computer } }
内容的提问来源于stack exchange,提问作者Arbelac
相关产品推荐
相关产品推荐

