web-dev-qa-db-fra.com

Erreur 0x80005000 et DirectoryServices

J'essaie d'exécuter une requête LDAP simple à l'aide de services d'annuaire dans .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();

Et je reçois l'exception suivante:

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()

En tant qu'extrait dans une application console, cela fonctionne. Mais lorsque je l'exécute dans le cadre d'un service WCF (exécuté sous les mêmes informations d'identification), l'exception ci-dessus est levée.

Aucune suggestion?

Merci

39
GodEater

C'est un problème de permission.

Lorsque vous exécutez l'application console, cette application s'exécute avec vos informations d'identification, par exemple. comme toi".

Le service WCF fonctionne où? Dans IIS? Très probablement, il s'exécute sous un compte distinct, qui n'est pas autorisé à interroger Active Directory.

Vous pouvez soit essayer de faire fonctionner le problème d'usurpation d'identité WCF afin que vos propres informations d'identification soient transmises, soit vous pouvez spécifier un nom d'utilisateur/mot de passe lors de la création de votre DirectoryEntry:

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

OK, donc ce ne sont peut-être pas les informations d'identification après tout (c'est généralement le cas dans plus de 80% des cas que je vois).

Pourquoi ne pas changer un peu votre code?

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];
   }
}

Mon idée est: pourquoi ne pas dire dès le départ à la DirectorySearcher quel attribut vous intéresse? Ensuite, vous n'avez pas besoin d'effectuer une autre étape supplémentaire pour obtenir la variable DirectoryEntry complète à partir du résultat de la recherche (ce qui devrait être plus rapide), et puisque vous avez demandé au chercheur d'annuaire de trouver cette propriété, celle-ci sera certainement chargée dans le résultat de la recherche. sauf si elle est nulle (pas de valeur définie), vous devriez pouvoir le récupérer facilement.

Marc

31
marc_s

J'ai eu la même chose encore et encore et rien ne semblait aider. 

Changer le chemin de ldap:// à LDAP:// a fait l'affaire. 

82
Aiello

Dans le contexte d'Ektron, ce problème est résolu en installant la fonctionnalité "Compatibilité IIS6 Metabase" dans Windows:

Vérifiez les "fonctionnalités Windows" ou les "services de rôle" pour la métabase IIS6 compatibilité, ajouter si manquant:

enter image description here

Réf.: https://portal.ektron.com/KB/1088/

16

J'ai eu la même erreur - dans mon cas c'était l'argument extra slash dans le chemin qui faisait la différence.

MAL:

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

BIEN:

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

J'ai eu cette erreur aussi et pour moi c'était une OU avec une barre oblique dans le nom: "Groupes d'accès aux fichiers/dossiers".

Ce fil de discussion m'a orienté dans la bonne direction. En fin de compte, appeler .Replace("/","\\/") sur chaque valeur de chemin avant utilisation a résolu le problème pour moi.

7
Nick Sarabyn

Sur les sites hébergés IIS, essayez de recycler le pool d'applications. Il a corrigé mon problème . Merci

4
Ernest

Je viens d'avoir ce problème dans un système de production de l'entreprise où je vis ... Une page Web qui a créé une liaison LDAP a cessé de fonctionner après la modification d'une adresse IP.

La solution .... J'ai installé l'authentification de base pour effectuer le dépannage indiqué ici: https://support.Microsoft.com/en-us/kb/329986

Et après cela, les choses ont commencé à fonctionner. Même après avoir réactivé l'authentification de base dans la page que je testais, toutes les autres pages ont recommencé à fonctionner avec l'authentification Windows.

Cordialement, Acácio

3
Acácio

Juste pour votre information, j'avais la même erreur et j'utilisais les informations d'identification correctes, mais mon URL LDAP était fausse :(

J'ai le même message d'erreur et le même code

3
sebagomez

Cette erreur peut se produire si la machine physique est à court de mémoire ..__ Dans mon cas, j'hébergeais un site sur IIS en train d'accéder à AD, mais le serveur manquait de mémoire.

1
lsp

J'ai passé une journée sur un problème similaire, mais toutes ces réponses n'ont pas aidé.

En fin de compte, je n'ai pas activé l'authentification Windows dans le paramètre IIS ...

0
YSJ

La même erreur se produit si dans DirectoryEntry.Patch n’est rien après les symboles "LDAP //:". Il est nécessaire de vérifier le directoryEntry.Path avant directorySearcher.FindOne (). À moins que le domaine spécifié explicitement ne nécessite pas "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); 
          }        
     }
}
0
DartAlex