2016-06-16 2 views
7

У меня есть код (ниже), который запускается каждые 15 минут. Иногда он не сможет запросить AD со следующей ошибкой:Paged AD Query Иногда сбой

System.DirectoryServices.Protocols.DirectoryOperationException: The server does not support the control. The control is critical. 
    at System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequest request, TimeSpan requestTimeout) 
  • Когда он работает успешно, весь процесс занимает около одной минуты, чтобы работать с запросом AD занимает около 30 секунд с 32 страниц.
  • Когда он не работает, он всегда находится на первой странице.
  • Кажется, что это не сбой в шаблоне (всегда разные времена дня), насколько я могу судить.

После прибегая к помощи этой ошибки, я нашел два SO вопросы (one, two), которые указывают на использовании AuthType.Ntlm, чтобы исправить эту проблему. Однако это не решило его для меня. Another говорит, чтобы проверить, поддерживает ли сервер пейджинг (он делает).

Любые идеи относительно того, почему это может произойти?

var attributesToReturn = new[] { 
    "givenName", 
    "sn", 
    "middleName", 
    "extensionAttribute8", 
    "department", 
    "sAMAccountName", 
    "userAccountControl" 
}; 
var filter = "(&(objectclass=user)(!(objectclass=computer))(sn=*)(givenName=*)(extensionAttribute8=*)(|(sn=a*)(sn=b*)(sn=c*)(sn=d*)(sn=e*)(sn=f*)(sn=g*)(sn=h*)(sn=i*)(sn=j*)(sn=k*)(sn=l*)(sn=m*)(sn=n*)(sn=o*)(sn=p*)(sn=q*)(sn=r*)(sn=s*)(sn=t*)(sn=u*)(sn=v*)(sn=w*)(sn=x*)(sn=y*)(sn=z*)))"; 
var currentBatch = 1; 
var searchRequest = new SearchRequest("DC=foo,DC=bar,DC=baz", filter, SearchScope.Subtree, attributesToReturn); 
var pageRequestControl = new PageResultRequestControl(500); 
searchRequest.Controls.Add(pageRequestControl); 

using (var ldapConnection = new LdapConnection("server.foo.bar.baz")) 
{ 
    ldapConnection.Credential = new NetworkCredential("user", "pass", "domain"); 
    ldapConnection.Timeout = new TimeSpan(0, 4, 0); 
    ldapConnection.AuthType = AuthType.Ntlm; // https://stackoverflow.com/a/14255413 

    while (true) 
    { 
     log.Debug("Fetching batch {0} from AD", currentBatch); 
     var searchResponse = (SearchResponse)ldapConnection.SendRequest(searchRequest); 
     var pageResultResponse = (PageResultResponseControl)searchResponse.Controls[0]; 

     log.Debug("Parsing AD response for batch {0}", currentBatch); 
     ParseResponse(_return, searchResponse, includeDisabled); 
     if (pageResultResponse.Cookie.Length == 0) 
      break; 
     pageRequestControl.Cookie = pageResultResponse.Cookie; 
     currentBatch++; 
    } 
} 
+0

Вы пытались уничтожить объекты, которые вы создаете? – Shago

+0

@Shago 'LdapConnection' - единственный доступный объект, который я использую, и обрабатывается с помощью инструкции' using'. – Chris

+0

При каких формулировках это исключение выбрано? –

ответ

0

Это не может быть проблемой, поскольку она не только для вас иногда, но я эту ошибку каждый раз, когда и должен был установить

ldapConnection.SessionOptions.ProtocolVersion=3 

для того, чтобы работать.

Смежные вопросы