wake-up-neo.net

Fehler 0x80005000 und DirectoryServices

Ich versuche, eine einfache LDAP-Abfrage mit Verzeichnisdiensten in .NET auszuführen.

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

Und ich bekomme die folgende Ausnahme:

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

Als Ausschnitt in einer Console-App funktioniert dies. Wenn ich es jedoch als Teil eines WCF-Dienstes (unter denselben Anmeldeinformationen ausgeführt) ausführen, wird die obige Ausnahme ausgelöst.

Irgendwelche Vorschläge?

Vielen Dank

39
GodEater

Es ist ein Erlaubnisproblem.

Wenn Sie die Konsolen-App ausführen, wird diese App mit Ihren Anmeldeinformationen ausgeführt, z. wie du".

Der WCF-Dienst läuft wo? In IIS? Am wahrscheinlichsten wird es unter einem separaten Konto ausgeführt, das nicht zum Abfragen von Active Directory berechtigt ist.

Sie können entweder versuchen, die WCF-Identitätswechselfunktion zum Laufen zu bringen, damit Ihre eigenen Anmeldeinformationen weitergeleitet werden, oder Sie können einen Benutzernamen/ein Kennwort angeben, wenn Sie DirectoryEntry erstellen:

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

OK, also sind es vielleicht nicht die Anmeldeinformationen (das ist normalerweise in mehr als 80% der Fälle der Fall).

Was ist, wenn Sie Ihren Code ein wenig ändern?

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

Meine Idee ist: Warum sagen Sie der DirectorySearcher nicht gleich, welches Attribut Sie interessieren? Dann müssen Sie keinen weiteren zusätzlichen Schritt ausführen, um die vollständige DirectoryEntry aus dem Suchergebnis zu erhalten (sollte schneller sein). Da Sie dem Verzeichnissucher gesagt haben, dass er diese Eigenschaft finden soll, wird er sicherlich in das Suchergebnis geladen Wenn es nicht null ist (kein Wert festgelegt), sollten Sie es leicht abrufen können.

Marc

31
marc_s

Ich hatte immer wieder dasselbe und nichts schien zu helfen. 

Das Ändern des Pfads von ldap:// in LDAP:// hat den Trick bewirkt. 

82
Aiello

Im Zusammenhang mit Ektron wird dieses Problem durch Installieren der Funktion "IIS6-Metabase-Kompatibilität" in Windows behoben:

Überprüfen Sie 'Windows-Features' oder 'Rollendienste' für IIS6-Metabasis Kompatibilität, falls fehlend:

enter image description here

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

16

Ich hatte den gleichen Fehler - in meinem Fall war es ein zusätzlicher Schrägstrich im Pfadargument, der den Unterschied ausmachte.

SCHLECHT:

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

GUT:

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

Ich hatte auch diesen Fehler und für mich war es eine OU mit einem Schrägstrich im Namen: "Datei-/Ordnerzugriffsgruppen".

Dieser Forum-Thread wies mich in die richtige Richtung. Am Ende löste das Aufrufen von .Replace("/","\\/") für jeden Pfadwert vor der Verwendung das Problem für mich.

7
Nick Sarabyn

Versuchen Sie, auf IIS gehosteten Sites den App-Pool zu recyceln. Es wurde mein Problem behoben. Danke

4
Ernest

Hatte gerade dieses Problem in einem Produktionssystem in der Firma, in der ich wohne ... Eine Webseite, auf der eine LDAP-Bindung erstellt wurde, funktionierte nicht mehr, nachdem sich eine IP geändert hatte.

Die Lösung ...... Ich habe die Basisauthentifizierung installiert, um die hier angegebene Problembehandlung durchzuführen: https://support.Microsoft.com/en-us/kb/329986

Und danach fingen die Dinge an zu arbeiten. Selbst nachdem ich die Basisauthentifizierung auf der von mir getesteten Seite wieder deaktiviert hatte, funktionierten alle anderen Seiten wieder mit der Windows-Authentifizierung.

Viele Grüße, Acácio

3
Acácio

Nur zu Ihrer Information, ich hatte den gleichen Fehler und verwendete die korrekten Anmeldeinformationen, aber meine LDAP-URL war falsch :(

Ich habe genau die gleiche Fehlermeldung und den gleichen Code erhalten

3
sebagomez

Dieser Fehler kann auftreten, wenn der physische Computer nicht mehr über genügend Arbeitsspeicher verfügt ..__ In meinem Fall hatte ich eine Site auf IIS, die versuchte, auf das AD zuzugreifen, aber der Server hatte nicht genügend Arbeitsspeicher.

1
lsp

Ich habe einen Tag mit meinem ähnlichen Problem verbracht, aber alle diese Antworten haben nicht geholfen.

In meinem Fall stellte sich heraus, dass ich die Windows-Authentifizierung nicht in IIS Einstellung aktiviert habe.

0
YSJ

Der gleiche Fehler tritt auf, wenn in DirectoryEntry.Patch nichts hinter den Symbolen "LDAP //:" steht. Es ist notwendig, das VerzeichnisEntry.Path vor dem VerzeichnisSearcher.FindOne () zu überprüfen. Sofern nicht ausdrücklich eine Domäne angegeben ist und "LDAP: //" nicht erforderlich ist.

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