Powershell AD 模块到期日期不同于 ADUC

时间:2021-04-26 16:31:46

标签: powershell active-directory

我遇到了一个问题。我想使用 Powershell 检查用户的到期日期,但问题是日期与 ADUC(Active Directory - 用户和计算机)不同。我的问题是,当我运行查询以获取到期日期时,它向我显示了与 GUI 随机不同的值,我们通常使用 GUI 来设置日期,因此完全错误。我什至找不到差异之间的模式,某处只有 1-2 小时(这是有道理的,因为如果这种情况发生在午夜左右,它可以更改日期)和某处 24 小时。这真的很烦人,因为我不知道我能做什么。所以,到目前为止我已经尝试过:

  1. 我尝试使用 AccountExpires 属性并以多种方式对其进行转换
  2. 我尝试手动处理差异,但因为差异不相等所以没有帮助
  3. 使用 ToLocalTime() 方法将日期转换为本地时间
  4. 我读过很多关于谷歌的文章...

这里有几个例子:

1. 这里的日期应该是 2021.05.26。

---------------------------------------------------------------------------------------
$myUser | Select Name, AccountExpirationDate, @{l="ExpDate"; e={([datetime]$_.AccountExpires).AddYears(1600)}}

Name      AccountExpirationDate ExpDate             
----      --------------------- -------             
Joci Kuka 2021.05.27. 0:00:00   2022.05.26. 22:00:00
---------------------------------------------------------------------------------------

2. 这里的日期应该是 2022.02.10。

---------------------------------------------------------------------------------------
$my_user | Select Name, AccountExpirationDate, @{l="ExpDate"; e={([datetime]$_.AccountExpires).AddYears(1600)}}

Name             AccountExpirationDate ExpDate
----             --------------------- -------
NotaValid Name 2022.02.11. 10:48:20  2022.02.11. 9:48:20
---------------------------------------------------------------------------------------

如果有人可以,请帮助我!

先谢谢你!

问候, 约瑟夫气味

1 个答案:

答案 0 :(得分:0)

AD 中的时间以常见的 Windows 格式存储,通常称为文件时间或 NT 时间纪元,它是一个 64 位整数,包含自 1601 年 1 月 1 日 (UTC) 以来的 100 纳秒时间段数。 The Active Directory schema documents make this clear

幸运的是,有一个通用函数可以将文件时间转换为本地日期时间,DateTime.FromFileTime()。要进行正确的转换,请这样做:

$myUser | Select Name, AccountExpirationDate, @{l="ExpDate"; e={[datetime]::FromFileTime($_.AccountExpires)}}

这基本上就是 AD 本身实际确定到期时间的方式。

ADUC 也做了一些静默操作。当您在 ADUC 中将到期日期设置为 2021-04-26 时,AD 中的值应为本地时间 2021-04-27 00:00:00,然后将其转换为 UTC FileTime(使用诸如 {{1 }})。这样它就会在 2021 年 4 月 4 日当天结束时到期。

如果您仍然看到时间变化,我的猜测是设置到期日期的用户在不同的时区,到期日期是在夏令时期间设置的(或不在夏令时期间),或者AD 撒谎,并没有真正使用 UTC。