Errore 0x80005000 e DirectoryServices

Sto cercando di eseguire una semplice query LDAP usando i servizi di directory in .Net.

DirectoryEntry directoryEntry = new DirectoryEntry("LDAP://someserver.contoso.com/DC=contoso,DC=com"); directoryEntry.AuthenticationType = AuthenticationTypes.Secure; DirectorySearcher directorySearcher = new DirectorySearcher(directoryEntry); directorySearcher.Filter = string.Format("(&(objectClass=user)(objectCategory=user) (sAMAccountName={0}))", username); var result = directorySearcher.FindOne(); var resultDirectoryEntry = result.GetDirectoryEntry(); return resultDirectoryEntry.Properties["msRTCSIP-PrimaryUserAddress"].Value.ToString(); 

E sto ricevendo la seguente eccezione:

 System.Runtime.InteropServices.COMException (0x80005000): Unknown error (0x80005000) at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) at System.DirectoryServices.DirectoryEntry.Bind() at System.DirectoryServices.DirectoryEntry.get_AdsObject() at System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne) at System.DirectoryServices.DirectorySearcher.FindOne() 

Come frammento di un’app Console, funziona. Ma quando lo eseguo come parte di un servizio WCF (eseguito con le stesse credenziali), genera l’eccezione di cui sopra.

Eventuali suggerimenti?

Grazie

È un problema di authorization.

Quando esegui l’app della console, l’app viene eseguita con le tue credenziali, ad esempio “tu”.

Il servizio WCF viene eseguito dove? In IIS? Molto probabilmente, viene eseguito con un account separato, che non è autorizzato a eseguire query su Active Directory.

Puoi provare a far funzionare la rappresentazione della rappresentazione WCF, in modo che le tue credenziali vengano trasmesse, oppure puoi specificare un nome utente / password per la creazione di DirectoryEntry:

 DirectoryEntry directoryEntry = new DirectoryEntry("LDAP://someserver.contoso.com/DC=contoso,DC=com", userName, password); 

OK, quindi potrebbe non essere le credenziali dopo tutto (che di solito è il caso in oltre l’80% dei casi che vedo).

Che ne dici di cambiare il tuo codice un po ‘?

 DirectorySearcher directorySearcher = new DirectorySearcher(directoryEntry); directorySearcher.Filter = string.Format("(&(objectClass=user)(objectCategory=user) (sAMAccountName={0}))", username); directorySearcher.PropertiesToLoad.Add("msRTCSIP-PrimaryUserAddress"); var result = directorySearcher.FindOne(); if(result != null) { if(result.Properties["msRTCSIP-PrimaryUserAddress"] != null) { var resultValue = result.Properties["msRTCSIP-PrimaryUserAddress"][0]; } } 

La mia idea è: perché non dire subito a DirectorySearcher quale attributo ti interessa? Quindi non è necessario eseguire un altro passaggio aggiuntivo per ottenere DirectoryEntry completa dai risultati della ricerca (dovrebbe essere più veloce) e poiché hai detto al ricercatore della directory di trovare quella proprietà, verrà sicuramente caricata nei risultati della ricerca, quindi a meno che non sia null (nessun valore impostato), dovresti essere in grado di recuperarlo facilmente.

Marc

Ho avuto lo stesso ancora e ancora e nulla sembrava aiutare.

Cambiando il percorso da ldap:// a LDAP:// fatto il trucco.

Nel contesto di Ektron, questo problema viene risolto installando la funzionalità “Compatibilità con Metabase IIS6” in Windows:

Controllare “Funzionalità Windows” o “Servizi ruolo” per la compatibilità con Metabase IIS6, aggiungere se mancante:

inserisci la descrizione dell'immagine qui

Rif: https://portal.ektron.com/KB/1088/

Ho avuto anche questo errore e per me è stata una OU con una barra in avanti nel nome: “File / File di accesso alle cartelle”.

Questo thread del forum mi ha indirizzato nella giusta direzione. Alla fine, chiamare .Replace("/","\\/") su ogni valore di percorso prima dell’uso ha risolto il problema per me.

Ho avuto lo stesso errore – nel mio caso era una barra in più nella discussione del percorso che ha fatto la differenza.

CATTIVO:

 DirectoryEntry directoryEntry = new DirectoryEntry("LDAP://someserver.contoso.com/DC=contoso,DC=com/", userName, password); 

BENE:

 DirectoryEntry directoryEntry = new DirectoryEntry("LDAP://someserver.contoso.com/DC=contoso,DC=com", userName, password); 

Solo FYI, ho avuto lo stesso errore e stavo usando le credenziali corrette ma il mio URL LDAP era sbagliato 🙁

Ho ottenuto esattamente lo stesso messaggio di errore e codice

Ho appena avuto quel problema in un sistema di produzione nella società in cui vivo … Una pagina web che ha fatto un binding LDAP ha smesso di funzionare dopo un IP cambiato.

La soluzione … … ho installato l’autenticazione di base per eseguire la risoluzione dei problemi indicata qui: https://support.microsoft.com/en-us/kb/329986

E dopo, le cose hanno appena iniziato a funzionare. Anche dopo aver ritriggersto l’autenticazione di base nella pagina che stavo testando, tutte le altre pagine hanno iniziato a funzionare di nuovo con l’autenticazione di Windows.

Saluti, Acácio

Sui siti ospitati da IIS, prova a riciclare il pool di app. Ha risolto il mio problema. Grazie

Questo errore può verificarsi se la macchina fisica ha esaurito la memoria. Nel mio caso stavo ospitando un sito su IIS cercando di accedere all’AD, ma il server aveva esaurito la memoria.

Lo stesso errore si verifica se in DirectoryEntry.Patch non c’è nulla dopo i simboli “LDAP //:”. È necessario controllare la directoryEntry.Path prima di directorySearcher.FindOne (). Salvo dominio esplicitamente specificato e non è necessario “LDAP: //”.

 private void GetUser(string userName, string domainName) { DirectoryEntry dirEntry = new DirectoryEntry(); if (domainName.Length > 0) { dirEntry.Path = "LDAP://" + domainName; } DirectorySearcher dirSearcher = new DirectorySearcher(dirEntry); dirSearcher.SearchScope = SearchScope.Subtree; dirSearcher.Filter = string.Format("(&(objectClass=user)(|(cn={0})(sn={0}*)(givenName={0})(sAMAccountName={0}*)))", userName); var searchResults = dirSearcher.FindAll(); //var searchResults = dirSearcher.FindOne(); if (searchResults.Count == 0) { MessageBox.Show("User not found"); } else { foreach (SearchResult sr in searchResults) { var de = sr.GetDirectoryEntry(); string user = de.Properties["SAMAccountName"][0].ToString(); MessageBox.Show(user); } } } 

Ho passato un giorno il mio problema simile, ma tutte queste risposte non hanno aiutato.

Nel mio caso, non ho abilitato l’autenticazione di Windows nelle impostazioni di IIS …