【问题标题】:Active Directory Attribute changing valueActive Directory 属性更改值
【发布时间】:2022-11-30 02:34:57
【问题描述】:

我正在尝试获取何时改变使用 DirectorySearcher 类从 Active Directory 获取用户记录的属性。

似乎值在获取期间或之后发生了更改,因为它与我在 LDAP 中看到的值不同。

例如。对于我自己的配置文件,LDAP 中的值如下:11/29/2022 5:10:21 东部标准时间但是在通过我的代码获取这个值之后,它说11/29/2022 10:10:24.请注意,根据我的系统时钟,这不是 10:10。

显而易见的结论是这是一个时区问题。但是我的系统也是 EST。此外,不同用户的时间差异也不同。

有谁知道为什么会这样?

【问题讨论】:

  • Active Directory 将日期/时间值存储为从 1601 年 1 月 1 日的 0 小时到存储的日期/时间之间经过的 100 纳秒间隔数。时间始终以格林威治标准时间 (GMT) 存储在 Active Directory 中。

标签: c# .net active-directory


【解决方案1】:

有几件事正在发生。

  1. 正如 Selvin 所提到的,该值始终以 GMT 存储,这解释了 5 小时的差异。
  2. 该值未在域控制器之间复制,这解释了 3 秒的差异。

    为了更详细地解释第二点,让我们以更新用户的title 为例。当更新发生时,whenChanged 属性被更新在进行更改的 DC 上.然后当新的 title 值被复制到另一个 DC 时,另一个 DC 更新 whenChanged 属性到复制发生的时间.因此,每个 DC 上的 whenChanged 值都会不同。

    whenChanged 值通常非常接近,但它们可能会有很大差异。例如,当您登录时,lastLogon 属性会在您进行身份验证的 DC 上与 whenChanged 一起更新。但是,lastLogon 未被复制,因此所有其他 DC 上的 whenChanged 值将不会更新。也就是说,除非到了更新 lastLogonTimestamp 值的时候,否则将进行复制。

    因此,如果您正在检查该值,请确保您正在从同一个 DC 读取。使用DirectoryEntry,您可以在 LDAP 路径中指定要使用的 DC:

    var user = new DirectoryEntry("LDAP://dc1.example.com/CN=someuser,OU=Users,DC=example,DC=com"
                   , null, null, AuthenticationTypes.ServerBind);
    

    使用 AuthenticationTypes.ServerBind 是因为 the documentation 说:

    指定服务器名称而不同时指定此标志会导致不必要的网络流量。

    或者您可以通过使用以下方式获取 DirectoryEntry 自动找到的 DC:

    var dc = user.Options.GetCurrentServerName();
    

【讨论】:

    猜你喜欢
    • 2014-02-24
    • 2018-06-11
    • 2020-09-22
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 2018-07-31
    相关资源
    最近更新 更多