You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 09:34:56