关于 Net User 和 Get-ADUser 的不同输出的非常普遍的问题。
当我运行每个命令时,幕后到底发生了什么?我之所以提出这个问题,是因为对于LastLogonDate
任何运行这两个命令的用户帐户,都会得到不同的结果。例如:
Get-ADUser -Identity "Abe" -Properties LastLogonDate
(返回 2021 年 2 月 8 日)Net user "Abe" /Domain
(返回 2021 年 2 月 11 日)
那么,到底发生了什么?我尝试使用,ADSI
但它返回的信息与 相同Get-ADUser
。如果这与 SO 的目的完全无关,请随时关闭它,我会在其他地方询问。
谢谢你!
答案1
返回的 lastLogonDate 属性Get-ADUser
映射到 AD 中的 lastLogonTimestamp 属性,该属性被复制但并不完全准确。请参阅描述这里。
Net User 指的是 AD 属性 lastLogon。该属性准确,但无法在域控制器之间复制。引用:
请注意,此值不会在域控制器之间复制 - 如果您想知道具有多个域控制器的域中帐户的确切上次登录时间,则必须在所有域控制器上检查此值!
有许多脚本可以收集域控制器并循环它们,然后返回找到的最新值。您可以检查这个答案和讨论了解一些见解。请注意,我们正在解决脚本的性能问题,但仍然有代码示例。
特别有趣的是,这两个属性都存储为 64 位整数,表示自 1/1/1601 12:00 以来的 100 纳秒间隔数,而其他答案中没有提到。但是,Get-ADUser
不会将 lastLogon 转换为典型[DateTime]
值。此外,它存储为 UTC,必须转换为本地时间,类似于下面的代码说明了这一点:
Get-ADUser saporito -properties 'LastLogonDate','LastLogon' |
Select *,@{Name = 'logonDate'; Expression = { [DateTime]::FromFileTimeUtc( $_.LastLogon ).ToLocalTime()}}
注意:Net User
似乎执行相同的转换。
注意:我添加了一个属性,而不是覆盖它。这只是为了演示,可能需要适配到更大的项目中。