提问者:小点点

无法使用uSNChanged获取更改


我想使用C#从Active Directory获取增量更改。为此,我正试图构建一个解决方案,如以下文章所述。

https://docs.microsoft.com/en-us/windows/win32/ad/polling-for-changes-using-usnchanged

然而,我面临以下问题:

  1. 用户没有可用的uSNChanged属性(尽管它可用于OU,即OrganizationalUnit)。我只能看到用户的以下属性

当我将用户从OU1移动到OU2时,highestcommittedusn会增加,但当我查询更改时(search.Filter=“(uSNChanged

同样的情况也适用于在OU中添加用户。

示例代码如下所述:

public static void GetUpdates()
{
    var myLdapConnection = createDirectoryEntry();
    var search = new DirectorySearcher(myLdapConnection);
    search.Filter = "(uSNChanged>=13000)";
    search.SearchScope = System.DirectoryServices.SearchScope.Subtree;
    var results = search.FindAll();
    Console.WriteLine(results.Count);
}

public static DirectoryEntry createDirectoryEntry()
{
    DirectoryEntry ldapConnection = new DirectoryEntry("LDAP://adfs.fed.abcd.com/DC=adfs,DC=fed,DC=abcd,DC=com");
    ldapConnection.Path = "adfs.fed.abcd.com";
    ldapConnection.AuthenticationType = AuthenticationTypes.Secure;
            return ldapConnection;
}

 private static long GetHighestUsn()
 {
     using (LdapConnection connection = new LdapConnection(ldapPath))
     {
          var filter = "(&(objectClass=*))";
          var searchRequest = new SearchRequest(null, filter, System.DirectoryServices.Protocols.SearchScope.Base, "highestCommittedUSN");
          var response = connection.SendRequest(searchRequest) as SearchResponse;
          var usn = response.Entries[0].Attributes["highestcommittedusn"][0];
          return Convert.ToInt64(usn);
      }
      return 0;
}

非常感谢您的帮助。


共1个答案

匿名用户

对于GetHighestUsn我认为newsearchrequest(null…中的null应该替换为一个空字符串来获取RootDSE。

其次,你混合了系统。DirectoryServices和系统。目录服务。协议:你最好坚持一个协议。不清楚new LdapConnection(ldapPath))中的ldapPath的值是什么。如果它是“adfs.fed.abcd.com”,并且您有多个域控制器,则您无法确切知道将回答哪一个域控制器,这与最后一句话有关。

最后,USNChanged属性是一个非复制属性,这意味着您应该始终请求相同的域控制器来获取更新。另一个域控制器将为同一对象存储完全不同的值。

通常,每个对象都应该返回USNChanged属性,除非您指定了要返回的属性的有限列表,在这种情况下,您还必须包含它。