我想使用C#从Active Directory获取增量更改。为此,我正试图构建一个解决方案,如以下文章所述。
https://docs.microsoft.com/en-us/windows/win32/ad/polling-for-changes-using-usnchanged
然而,我面临以下问题:
当我将用户从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;
}
非常感谢您的帮助。
对于GetHighestUsn
我认为newsearchrequest(null…
中的null
应该替换为一个空字符串来获取RootDSE。
其次,你混合了系统。DirectoryServices和系统。目录服务。协议
:你最好坚持一个协议。不清楚new LdapConnection(ldapPath))
中的ldapPath
的值是什么。如果它是“adfs.fed.abcd.com”,并且您有多个域控制器,则您无法确切知道将回答哪一个域控制器,这与最后一句话有关。
最后,USNChanged
属性是一个非复制属性,这意味着您应该始终请求相同的域控制器来获取更新。另一个域控制器将为同一对象存储完全不同的值。
通常,每个对象都应该返回USNChanged
属性,除非您指定了要返回的属性的有限列表,在这种情况下,您还必须包含它。