域与目录服务

帐户将 LastLogonTimestamp 值设置为未来 - Windows Server

· 52CE 我爱测

本文可帮助解决用户或计算机帐户将 lastLogonTimestamp 值设置为将来时间的问题。 你有一个 Active Directory(AD)域,并使用 AD 查询查找未使用的帐户。 查询类似 pwdLastSet 和 lastLogonTimestamp 的属性以确定哪些帐户不再使用。 尽管由于 Kerberos S4U 更新属性,使用 lastLogonTimestamp 存在其限制,但你注意到一些正在活跃使用的帐户的 lastLogonTime

本文可帮助解决用户或计算机帐户将 lastLogonTimestamp 值设置为将来时间的问题。

你有一个 Active Directory(AD)域,并使用 AD 查询查找未使用的帐户。 查询类似 pwdLastSet 和 lastLogonTimestamp 的属性以确定哪些帐户不再使用。

尽管由于 Kerberos S4U 更新属性,使用 lastLogonTimestamp 存在其限制,但你注意到一些正在活跃使用的帐户的 lastLogonTimestamp 值被设置为将来的时间。

本地 DC 上的时间不正确

域控制器(DC)可能会在其系统时间被设置为未来的情况下运行。 在这种情况下,如果用户使用 DC 进行身份验证,则 DC 将本地时间与用户帐户中存储的时间进行比较。 然后,DC 会更新 lastLogonTimestamp 值,因为它的当前时间要最近得多。

由于虚拟机(VM)主机、网络时间协议(NTP)基础结构或 安全时间种子设定(STS)出现时间同步问题,DC 上的时间可能不正确。 DC 可能还会快速回到正确的时间,因此可能无法在您的汇报中捕获到问题。

由于 NTP 防止 DC 之间的大时间偏移量分散到域中,因此不正确的时间戳可能会保留到单个 DC 的本地。 但是,即使 DC 在 Kerberos 请求期间检测到时间偏移,域成员也遵循其本地 DC 的时间。 这就是为什么 Kerberos 事务在这种情况下仍然有效的原因。

将 fixupObjectState 属性与 LDIFDE 配合使用来修复对象

对于早期版本的 Windows,解决问题的方法包括:

  • 等到实际时间超过用户指定的 lastLogonTimestamp 值。
  • 忽略lastLogonTimestamp值,并使用其他指标识别孤儿账户。
  • 删除受影响的帐户并创建新帐户。

在 Windows Server 2022 和 Windows Server 2025 中,有一个新工具可以修复 [MS-ADTS]: fixupObjectState 中指定的损坏对象。

注释

存在更正缺失 sAMAccountType 和 objectCategory 属性的功能。 有关详细信息,请参阅“无法编辑或删除 AD 对象,并收到错误”属性由安全帐户管理器(SAM)拥有“或”指定的帐户不存在”。

步骤 1:标识对象名称和全局唯一标识符(GUID)

例如:

  • 专用名(DN):cn=brokenuser,ou=bad-users,dc=contoso,dc=com
  • GUID:cf2b4aca-0e67-47d9-98aa-30a5fe30dc36

步骤 2:使用基于 DN 字符串或 GUID 的语法准备 LDIFDE 导入文件

  • 使用 DN 字符串:

    DN:
    Changetype:modify
    add: fixupObjectState
    fixupObjectState: cn=brokenuser,ou=bad-users,dc=contoso,dc=com:LastLogonTimestamp
    -
    

    注释

    对于格式完好的 LDIFDE 导入文件,需要包含仅有连字符(-)的行和空行。

  • 使用基于 GUID 的语法:

    如果对象名称包含特殊字符,请对 LDIFDE 导入文件使用 Unicode,或使用基于 GUID 的语法。

    还可以在基于 GUID 的语法中表示 <guid=cf2b4aca-0e67-47d9-98aa-30a5fe30dc36> 对象名称。

    所以, fixupObjectState: cn=brokenuser,ou=bad-users,dc=contoso,dc=com:LastLogonTimestamp 表达式变成 fixupObjectState: <guid=cf2b4aca-0e67-47d9-98aa-30a5fe30dc36>:LastLogonTimestamp。

    要将此语法与 LDIFDE 导入文件一起使用,需要对第一个冒号后的文本进行 Base64 编码,这主要是因为它包含大于(>)和小于(<)符号。

    fixupObjectState:: PGd1aWQ9Y2YyYjRhY2EtMGU2Ny00N2Q5LTk4YWEtMzBhNWZlMzBkYzM2PjpMYXN0TG9nb25UaW1lc3RhbXA=
    

    注释

    双冒号显示属性值为 Base64 格式。 可以使用 Base64 编码器 直接在 Web 上对字符串进行编码。

    使用 Base64 格式后,导入文件将变为:

    DN:
    Changetype:modify
    add: fixupObjectState
    fixupObjectState:: PGd1aWQ9Y2YyYjRhY2EtMGU2Ny00N2Q5LTk4YWEtMzBhNWZlMzBkYzM2PjpMYXN0TG9nb25UaW1lc3RhbXA=
    -
    

步骤 3:使用 LDIFDE 修复对象

以企业管理员身份登录,并使用以下命令导入 LDIFDE 导入文件(例如 ** ,repair-user.txt**):

ldifde /i /f repair-user.txt
Connecting to "<DC name>"
Logging in as current user using SSPI
Importing directory from file " repair-user.txt"
Loading entries...
1 entry modified successfully.

然后,该对象将 lastLogonTimestamp 属性值设置为当前时间。

参考文献

有关属性用法 lastLogonTimestamp 的详细信息,请参阅:

资料来源与适用范围

资料来源
微软官方中文故障文档
适用范围
按正文的 Windows / Windows Server 适用版本;保留原文兼容性要求
内容语言
中文;命令、路径和错误标识保留技术原文
本地收录日期
2026-10-26
授权说明
CC BY 4.0

正文与所需资源由本站本地存储。查看来源及更新记录 ↗

请按适用版本和实际日志确认原因;本站没有对每一种系统或设备逐项执行文中的操作。