PowerShell查询AD近90天登录用户脚本结果异常排查
问题根因
你的脚本筛选逻辑完全写反,还叠加了无关、错误的过滤条件,导致返回结果不符合预期。
修正方案
小型单域控环境可用脚本
如果你的域只有1台域控,或者能接受LastLogonDate属性最多14天的同步延迟,直接用下面的脚本即可:
# 计算90天前的时间阈值 $cutoffDate = (Get-Date).AddDays(-90) Get-ADUser -SearchBase "OU=Domain Users,DC=x,DC=state,DC=x,DC=x" ` -Properties LastLogonDate ` -Filter {LastLogonDate -ge $cutoffDate} | Select-Object Name, SamAccountName, LastLogonDate | Export-Csv -Path "C:\Temp\Last90DaysLogonUsers.csv" -NoTypeInformation -Encoding UTF8
多域控环境精准查询脚本
如果域内有多台域控,要拿到完全准确的最后登录时间,需要遍历所有域控取用户登录时间的最大值,脚本如下:
$cutoffDate = (Get-Date).AddDays(-90) # 获取域内所有域控列表 $allDomainControllers = Get-ADDomainController -Filter * # 获取指定OU下的所有用户 $allUsers = Get-ADUser -SearchBase "OU=Domain Users,DC=x,DC=state,DC=x,DC=x" -Filter * $result = foreach ($user in $allUsers) { # 遍历所有域控查询该用户的最后登录时间,取最大值 $latestLogon = $allDomainControllers | ForEach-Object { Get-ADUser $user -Server $_.HostName -Properties LastLogon | Select-Object -ExpandProperty LastLogon } | Measure-Object -Maximum | Select-Object -ExpandProperty Maximum if ($latestLogon -gt 0) { $latestLogonDate = [DateTime]::FromFileTime($latestLogon) # 仅保留90天内有登录记录的用户 if ($latestLogonDate -ge $cutoffDate) { [PSCustomObject]@{ Name = $user.Name SamAccountName = $user.SamAccountName LastLogonDate = $latestLogonDate } } } } $result | Export-Csv -Path "C:\Temp\Last90DaysLogonUsers.csv" -NoTypeInformation -Encoding UTF8
原脚本错误点说明
- 比较逻辑写反:你用
lastlogondate -le $90days筛选的是最后登录时间早于90天前的用户,和你要的「90天内有登录记录」的需求完全相反,正确的比较符应该是-ge(大于等于),匹配登录时间晚于90天阈值的记录 - 错误纳入空值账号:
lastlogondate -notlike "*"会把所有从未登录过、LastLogonDate字段为空的遗留账号全部纳入结果,这就是你结果里出现大量2014年老旧记录的核心原因 - 叠加无关过滤条件:
passwordlastset -le $90days是按密码最后设置时间筛选,和登录时间的需求没有关联,会错误排除90天内改过密码的活跃用户,同时纳入90天没改密码的非活跃用户 - 不必要的性能损耗:
-Properties *会拉取用户对象的所有AD属性,用户量大的时候查询速度会极慢,只需要指定查询要用到的属性即可
内容的提问来源于stack exchange,提问作者saxman88
相关产品推荐
相关产品推荐

