2016-06-16 23 views
7

Her 15 dakikada bir çalışan bir kodum (aşağıda) var. Bazen aşağıdaki hata ile AD'yi sorgulamak için başarısız olur: başarıyla çalıştığındaPaged AD Sorgusu Bazen Başarısız Olur

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) 
  • , tüm süreç 32 sayfalık yaklaşık 30 saniye alıyor AD sorgu ile çalıştırmak için yaklaşık bir dakika sürer. o başarısız oluyor
  • , ilk sayfada hep bu.
  • Anlatabildiğim kadarıyla bir desende (günün farklı zamanlarında) başarısız görünmüyor.

o hatayı Googling sonra ben iki SO sorular (one, two) sorunu gidermek için AuthType.Ntlm kullanarak bulduğuna işaret. Bu benim için bunu çözmedi. Another, sunucunun çağrıyı destekleyip desteklemediğini denetler (yapar).

neden Buna yol açabilecek olarak herhangi bir fikir?

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

Oluşturmakta olduğunuz nesneleri atmayı denediniz mi? – Shago

+0

@Shago 'LdapConnection' kullanmakta olduğum tek kullanımlık nesnedir ve bu' using' ifadesiyle ele alınmıştır. – Chris

+0

Bu istisnayla hangi istisna atıldı? –

cevap

0

sadece bazen sizin için başarısız çünkü bu sorun olmayabilir, ama bu hatayı her zaman vardı ve hiç çalışmak için

ldapConnection.SessionOptions.ProtocolVersion=3 

ayarlamak zorunda kaldı.

İlgili konular