我有一个产品,每天运行完全同步,并且每30分钟同步一次。它有一个搜索过滤器,如:'(|(&(objectClass = User)(!(ObjectClass = Computer))((memberOf = {some_dn}))))'。完全同步或incr同步生成的cookie将用作下一个incr搜索的输入。 在我们的env上,经过15次成功的同步后(其他情况下,可能只有4次),第16个incr同步卡住(等待AD服务器响应,因为DirectorySearch的超时设置为-1。是的,我可以设置为5分钟到期但它仍然没有返回你想要的东西)。当我拿起这个失败的incr搜索的cookie并在我的另一个独立应用程序(只是一个充满DirectorySearch代码的WinForm)中运行它时,它也卡住了。
另一个奇怪的事情是,当我检查日志并获得前15个成功的incr搜索所使用的cookie并在我的独立应用程序中运行时,所有这15个cookie都被卡住了! 还有一件奇怪的事情发生在我仍然使用cookie进行第16次incr搜索时,但是将过滤器更改为'(&(objectClass = User)(!(ObjectClass = Computer)))''(这里我删除了member = {.. 。}),搜索可以通过。
我们唯一可以恢复产品的是另一个完全同步,它始终有效,然后在完全同步后可以通过搜索。但是,在n次同步之后,incr搜索将再次停留。
代码应如下所示:
var searcher = new DirectorySearcher()
{
ClientTimeout = TimeSpan.FromSeconds(-1),
ServerPageTimeLimit = TimeSpan.FromSeconds(-1),
ServerTimeLimit = TimeSpan.FromSeconds(-1),
DerefAlias = DereferenceAlias.Never,
ReferralChasing = ReferralChasingOption.None
};
searcher.SearchRoot = new DirectoryEntry(basePath);
searcher.Filter = extraFilter;
searcher.SearchScope = SearchScope.Subtree;
searcher.CacheResults = false;
searcher.PropertiesToLoad.AddRange(new string[] { "name", "mail" });
searcher.DirectorySynchronization = new DirectorySynchronization();
searcher.DirectorySynchronization.Option |= DirectorySynchronizationOptions.ObjectSecurity
| DirectorySynchronizationOptions.ParentsFirst;
searcher.DirectorySynchronization.Option |= DirectorySynchronizationOptions.IncrementalValues;
searcher.DirectorySynchronization.ResetDirectorySynchronizationCookie(Convert.FromBase64String(cookie));
searcher.ExtendedDN = ExtendedDN.HexString;
我的代码中是否有问题,或者它是MS AD中的错误?我的AD是MS AD 2012。
更新时间09/09/2018: 最终,它是AD 2008,2012的一个错误,微软很快就会发布补丁。