PowerShell转换Active Directory用户lastlogonTimestamp值报错求助
解决Active Directory用户lastlogonTimestamp转换错误及批量提取方法
错误原因
lastlogonTimestamp不是你以为的Unix时间戳,它是Windows文件时间:以100纳秒为单位计数,起始点是1601年1月1日,直接用AddSeconds处理会因为数值过大触发范围错误,这就是你报错的核心原因。
正确的单个用户时间转换方法
把你的代码改成下面这样就能正常转换:
# 替换成你要查询的用户名 $Username = "testuser" # 获取用户的lastlogonTimestamp属性 $user1logon = (Get-ADUser -Identity $Username -Properties lastlogonTimestamp).lastlogonTimestamp # 转换为可读时间,同时处理用户从未登录的情况 if ($user1logon) { $reallogon = [DateTime]::FromFileTime($user1logon) # 输出格式化后的时间 $reallogon.ToString("yyyy-MM-dd HH:mm:ss.ffffff") } else { Write-Host "该用户从未登录过AD" }
核心是用.NET的[DateTime]::FromFileTime()方法,它专门用来解析Windows文件时间,直接传入lastlogonTimestamp的数值就能得到正确的时间对象。另外加了null判断,避免用户从未登录时后续代码报错。
批量提取用户最后登录列表
如果需要批量导出AD用户的最后登录信息,用这个脚本:
# 获取所有启用的AD用户(可修改Filter过滤条件,比如限制OU范围) Get-ADUser -Filter {Enabled -eq $true} -Properties Name, SamAccountName, lastlogonTimestamp | Select-Object Name, SamAccountName, @{ Name = "LastLogonTime" Expression = { if ($_.lastlogonTimestamp) { [DateTime]::FromFileTime($_.lastlogonTimestamp) } else { "从未登录" } } } | # 导出到CSV文件,路径可自行修改 Export-Csv -Path "C:\AD_User_LastLogon.csv" -Encoding UTF8 -NoTypeInformation
- 用
Get-ADUser的Filter参数可以筛选用户,比如只查某个OU下的用户可以加-SearchBase "OU=Users,DC=domain,DC=com"。 - 通过计算属性
LastLogonTime统一处理时间转换和未登录标记。 - 最后导出为CSV文件,方便用Excel或其他工具查看分析。
内容的提问来源于stack exchange,提问作者Bancroft
相关产品推荐
相关产品推荐

