Printout Header
RSS Feed

ADSI Fehler Codes und Laufzeitfehlerbehandlung


ADSI-Aufrufe können aus vielen potentiellen Gründen fehlschlagen: Der LDAP-Server ist nicht erreichbar, die Anmeldedaten sind falsch, man hat nicht die erforderlichen Rechte, das Objekt oder im Skript verarbeitete Attribute existieren nicht oder können auf die angegebene Weise nicht zugegriffen werden usw. usw.

Folgende Abschnitte stehen zur Verfügung:


ADSI Error Codes
Error Codes umrechnen : Dezimal <> Hex
Laufzeitfehlerbehandlung für ADSI in Scripts



ADSI Error Codes


Es folgt eine Liste der möglichen Rückgabewerte im Fehlerfall, wenn Sie die ADSI-Funktionen verwenden. Grundsätzliche Infos hierzu kann man im Microsoft Developer Network und in der KnowledgeBase erhalten:


Allgemeine ADSI-Fehlercodes

Win32 Fehlercodes für ADSI

Win32 Fehlercodes für ADSI 2.0

Spezielle Fehlercodes für ADO-Abfragen.



Speziell im MSDN sind die Error-Codes allerdings in hexadezimaler Schreibweise aufgeführt. Während der Laufzeit eines VBScripts hingegen wird der Fehler als negative Dezimalzahl angezeigt. Erläuterungen zur Umrechung zwischen diesen beiden Werten können Sie im nächsten Abschnitt nachlesen.


Error-Code (Dezimal) Error-Code (Hex) Erläuterung
-2147467259 0x80004005 ADO_UNSPECIFIED Diese Fehlernummer weist auf keine konkrete Ursache der Störung hin, tritt jedoch stets bei Problemen in ADO-Abfragen auf. Es kann z.B. sein, dass Sie vergessen haben, in Ihrem Abfrage-String den Suchlevel (Subtree, OneLevel usw.) mit zu übergeben. Diese Fehlermeldung kann auch dann auftreten, wenn Sie ohne ADO zu verwenden ein Objekt Attribut mit dem falschen Datentyp beschreiben wollen (z.B. wenn sie der ADSI-Methode Put ein Integer- oder String-Attribut mit einer Gleitkommazahl füllen wollen). Wandeln sie in diesem Fall den zu schreibenden Wert zuerst in einen String um.

-2147463168 0x80005000 ADS_BAD_PATHNAME Dieser Fehler tritt auf, wenn bei LDAP BIND-Versuchen an Objekte oder bei ADODB-Connections der angegebene LDAP-Pfad nicht stimmt. Es wird vielleicht versucht, mit einem GetObject-Befehl auf ein Objekt zuzugreifen, das es gar nicht gibt, oder bei dem sich ein Schreibfehler im Distinguished Name eingeschlichen hat.

Mehr Infos erhalten Sie im folgendem Abschnitt des SelfADSI Tutorials: "LDAP Pfadnamen - Distinguished Names".

-2147463160 0x80005008 ADS_BAD_PARAMETER Dieser Fehler kann verschiedenste Ursachen haben. Einer der in einer ADSI-Funktion verwendeten Parameter ist falsch - entweder vom Datentyp her oder von der Logik. Der Fehler tritt z.B. dann auf, wenn die angegebene Objektklasse beim Aufruf der ADSI-Methode Delete für ein Objekt nicht korrekt war. Oder bei einem Aufruf von GetInfoEx wurde kein Array als erster Parameter verwendet.

-2147463156 0x8000500C ADS_TYPE_CANNOT_BE_CONVERTED Dieser Fehler tritt dann auf, wenn Sie versuchen auf Provider-Specific Attribute zuzugreifen, ohne dabei die dafür notwendige Technik zu verwenden. Manche Verzeichnisdienste geben die Objekt-Attribute in diesem seltsamen Syntax-Format zurück. Statt den normalen Lesemethoden mit Get oder GetExmüssen Sie hier die Attribut-Daten über den Property-Cache und die Funktion GetPropertyItem.

Eine Beschreibung der Zugriffe auf Provider-Specific Attribute hier im SelfADSI-Tutorial finden sie in den Abschnitten "Provider Specific Attribute".

-2147463155 0x8000500d ADS_PROPERTY_NOT_FOUND Dieser Fehler wird dann ausgegeben, wenn Sie versuchen auf Attribute zuzugreifen, die sich nicht im sogenannten Property-Cache befinden. Diesen Cache hat man mit den Funktionen GetObject, GetInfo oder GetInfoEx gefüllt. Es könnte sein, dass es sich um ein Operational Attribut handelt, dass nicht automatisch in den Cache geladen wird, sondern erst explizit aus dem Verzeichnis abgefragt werden muss. Oder es handelt sich um einen schlichten Schreibfehler bei der Angabe des Attributs.

-2147217911 0x80040e09 ADO_PERMISSION_DENIED Ein ADO-Aufruf schlug fehl, weil der Benutzer, der bei der BIND-Anmeldung am Verzeichnis verwendet wurde, dazu keine Berechtigung besitzt.

-2147217900 0x80040e14 ADO_INVALID_SEARCH_FILTER_SYNTAX Dieser Fehler kann beim Versuch auftreten, eine ADODB-Suche im Verzeichnis durchzuführen. Diese schlägt fehl, wenn der übergebene ADO-Suchstring syntaktisch nicht korrekt ist. - also nicht nur dann wenn der LDAP-Filter darin falsch ist. Auch andere Syntaxfehler im ADO-Command String führen zu dieser Fehlermeldung.

-2147217865 0x80040e37 ADO_SEARCH_TABLE_DOES_NOT_EXIST Dieser Fehler kann beim Versuch auftreten, eine ADODB-Suche im Verzeichnis durchzuführen. Diese schlägt fehl, wenn der angegebene LDAP-Server nicht erreichbar ist oder der übergebene LDAP-Pfad nicht vorhanden ist, in dem nach Objekten gesucht werden soll. Es gibt jedoch auch LDAP-Server (z.B. Novell NetWare), die diesen Fehler zurückgeben, wenn die in der ADO-Abfrage verwendete User-ID nicht existiert!

-2147024891 0x80070005 ADS_INSUFFICIENT_RIGHTS Ein ADSI-Aufruf schlug fehl, weil der Benutzer, der bei der BIND-Anmeldung am Verzeichnis verwendet wurde, dazu keine Berechtigung besitzt.

-2147024865 0x8007001f LDAP_OTHER Ein unspezifischer Fehler, der alle möglichen Ursachen haben kann. Konkret tritt dieser Fehler z.B. bei dem Versuch auf, AD-Gruppen in andere Gruppen aufzunehmen, ohne den Gruppenbereich zu beachten (globale Gruppen können Gruppen aus anderen Domänen enthalten, Domänen-Lokale Gruppen können nicht in anderen Domänen in Gruppen aufgenommen werden usw.).

Der Fehler kann bei der Erzeugung von AD-Objekten auch dann auftreten, wenn im relative Distinguished Name oder anderen Namens-Attributen spezielle Zeichen (wie z.B. \ / = , usw.) auftreten bzw. nicht korrekt kodiert sind.

-2147023570 0x8007052e LDAP_INVALID_CREDENTIALS Dieser Fehler tritt auf, wenn bei der BIND-Authentifizierung am Verzeichnis der übergebenen Benutzernamen nicht existiert oder das Passwort falsch ist. Eventuell erlaubt der Server auch keine unverschlüsselte Anmeldung.

-2147023541 0x8007054b LDAP_DOMAIN_DOESNT_EXIST Dieser Fehler tritt bei der Verwendung der ADSI Funktion MoveHere auf, wenn ein Objekt umbenannt oder verschoben werden soll. Die Funktion MoveHere benötigt zwei Parameter: Einen kompleten LDAP-Pfad und einen Relativ Distinguished Name.

Der Fehler deutet hier auf einen Syntaxfehler in einem dieser Parameter hin, evtl. wird beim LDAP-Pfad auch ein Objekt angegeben, das garnicht existiert. Achten Sie hierbei nicht nur auf deie Angabe der Domäne, sondern überprüfen Sie alle Teile der LDAP-Namensangaben.

Es kann auch sein, dass Sie versuchen, einen Container umzubenennen oder zu verschieben, in dem andere Objekte enthalten sind - kein Problem im Active Directory, aber von einigen anderen LDAP-Servern verboten.

-2147019886 0x80071392 LDAP_ALREADY_EXISTS Dieser Fehler taucht dann auf, wenn die ADSI-Methode Create auf ein Container-Objekt angewendet wird und der Distinguished Name des zu erzeugenden Objektes bereits vorhanden ist.
Eine andere Ursache könnte sein, dass die ADSI funktion Add (für AD Gruppenmitgliedschaften) aufgerufen wurde und das betreffende Objekt bereits Mitglied in der Gruppe ist.

-2147016694 0x8007200a LDAP_NO_SUCH_ATTRIBUTE Dieser Fehler tritt auf, wenn man versucht ein nicht existierendes Attribut mit Hilfe der Funktion GetInfoEx in den Property-Cache eines Objektes zu lesen.

-2147016691 0x8007200d LDAP_ATTRIBUTE_OR_VALUE_EXISTS Dieser Fehler tritt vor allem auf, wenn man versucht, bei Gruppen Mitglieder hinzuzufügen, die bereits vorher Mitglied der Gruppe waren.

-2147016684 0x80072014 LDAP_OBJECT_CLASS_VIOLATION Ein solcher Fehler tritt unter Umständen dann auf, wenn man ein Objekt erzeugt, ohne die SetInfo Funktion aufzurufen, und unmittelbar danach Attribute dieses Objektes schreiben will. Hier wäre die richtige Reihenfolge, das Objekt (mit allen Pflicht-Attributen) zu erzeugen, dann die SetInfo Funktion aufzurufen, und erst danach weitere Attribute zu schreiben.

-2147016683 0x80072015 LDAP_ONLY_ALLOWED_ON_LEAFS Dieser Fehler tritt auf, wenn man versucht, ein Objekt mit Child Objekten darunter zu löschen. Mit anderen Worten: Es lassen sich nur leere Container löschen! Es gibt zwar das Extended LDAP Control "Delete Tree", derartige Controls lassen sich jedoch innerhlab vo ADSI-Scripten nicht verwenden.

Was zu tun ist, um einen nicht-leeren Container löschen zu können, finden Sie im Artikel "LDAP Verzeichnisobjekte löschen" hier im SelfADSI Tutorial.

-2147016682 0x80072016 LDAP_NOT_ALLOWED_ON_RDN Dieser Fehler tritt auf, wenn man den Relative Distinguished Name eines Objektes ändern will, diese Operation vom Verzeichnisdienst jedoch nicht erlaubt wird. Man könnte als Alternative versuchen, das betreffende Objekt mit der ADSI-Move-Funktion umzubenennen.

-2147016671 0x80072021 LDAP_PROTOCOL_ERROR Dieser Fehler tritt z.B. dann auf, wenn man bei der beim Schreiben von Attributen den falschen Datentyp übergibt. Es existieren z.B. eine Reihe von Attributen, die einen Distinguished Name erfordern. Wenn man bei der Put-Methode statt dessen einen einfachen String übergibt, dann kann es zu dieser Fehlermeldung kommen.

-2147016661 0x8007202b LDAP_REFERRAL Dieser Fehler tritt z.B. dann auf, wenn man bei der OpenDSObject Methode an einem Windows Active Directory einen falschen Distinguished Name übergibt. Insbesondere dann, wenn speziell der Name des Namenskontext fehlerhaft ist (also z.B. die Angabe des Domänen-Namens).

-2147016657 0x8007202f LDAP_CONSTRAINT_VIOLATION Eine interne Bedingung des Verzeichnisdienstes wurde verletzt. Vielleicht wurde versucht, ein Exchange-Postfach mit einer SMTP-Adresse zu erzeugen, die nicht eindeutig ist. Oder es wurde versucht, einen ADS-Benutzer-Objekt zu erzeugen, dass keinen Anmeldenamen besitzt. Es gibt auch z.B. Attribute, die den Distinguished Name eines anderen Verzeichins-Objektes beinhalten müssen (z.B. bei den Weiterleitungs-Konfigurationen für Postfächer). Wenn versucht wird, einen beliebigen Text in ein solches Attribut zu schreiben, tritt dann die Constraint Violation auf. Eine weitere Möglichkeit: es wurde versucht, in einer Mixed Mode-Umgebung Gruppen zu verschachteln, was dort nicht möglich ist.

-2147016656 0x80072030 LDAP_NO_SUCH_OBJECT Dieser Fehler ist ähnlich zu ADS_BAD_PATHNAME (0x80005008) - es wurde beim Bind-Vorgang ein LDAP-Objektpfad von einem nicht existierenden Objekt übergeben. Die Eigenart ist hierbei, dass in ADS-Umgebungen stets ADS_BAD_PATHNAME zurückgegeben wird und bei anderen LDAP-Servern (z.B. in Novell eDirectory-Umgebungen) eben dieser Fehler hier.

-2147016654 0x80072032 LDAP_INVALID_DN_SYNTAX Dieser Fehler tritt auf, wenn man bei Erzeugen von Objekten einen Distinguished-Name verwendet, der ungültige Zeichen enthält.

-2147016651 0x80072035 LDAP_UNWILLING_TO_PERFORM Der LDAP-Server weigert sich, die angeforderte Aktion auszuführen. Dieser Fehler tritt auf, wenn man per ADSI das Passwort eines ADS-Benutzers ändern will, das neue Passwort jedoch nicht den Anforderungen der Domänen-Richtlininen entspricht (zu kurz, zu einfach oder vorher schon benutzt). Oder man versucht Attribute zu ändern, die nur der Security Account Manager ändern darf (z.B. lastLogon).

Dieser Fehler tritt auch in Zusammenhang mit Manipulationen des ADS Schemas auf. Entweder war es nicht erlaubt das Schema zu ändern, oder der Schema-Master Domänen-Controller war nicht erreichbar, oder es war gerade eine andere Schema-Erweiterung aktiv.

-2147016649 0x80072037 LDAP_NAMING_VIOLATION Dieser Fehler tritt in Zusammenhang mit der Erzeugung von Objekten oder dem Zugriff auf deren Attribute auf. Die Ursache ist die Verwendung eines ungültigen LDAP-Pfades, z.B. wenn Sie eine Organizational Unit mit der Bezeichnung cn=.... anlegen wollen.

-2147016646 0x8007203a LDAP_SERVER_DOWN Dieser Fehler tritt auf, wenn bei der BIND-Authentifizierung am Verzeichnis der angegebene Server nicht erreichbar ist. Dies kann an grundsätzlichen Netzwerkproblemen liegen. Vielleicht blockiert auch eine Firewall den verwendeten LDAP-Port, oder der LDAP-Server ist auf dem Zielrechner gar nicht aktiv.

-2146827850 0x800a01b6

METHOD_OR_PROPERTY_NOT_SUPPORTED Dieser Fehler tritt im Zusammenhang mit Verzeichnis- und LDAP-Skripting z.B. dann auf, wenn Sie versucht haben, auf ein Objekt-Attribut direkt mit der Schreibweise "object.attribute" oder mit den Funktionen Get und Put zuzugreifen. Der Fehlercode besagt, dass es dieses Attribut überhaupt nicht gibt oder das die verwendete Funktion nicht mit dem Datentype des Attributes umgehen kann.

 

Prüfen Sie also, ob ie vielleicht einen Schreibfehler im Attributnamen haben. Oder verwenden Sie statt Get und Put lieber GetEX und PutEx.

Eine Beschreibung der Zugriffe auf Objekt-Attribute hier im SelfADSI-Tutorial finden sie in den Abschnitten "LDAP Objekt-Attribute lesen" und "LDAP Objekt-Attribute schreiben".

     


Error Codes umrechnen : Dezimal <> Hex


Sie finden für einen Laufzeitfehlercode (z.B. -2147217911) keinen Eintrag in den Microsoft-Dokumentationen? Rechnen Sie den Wert in einen Hexwert um - Microsoft verweist in seinen Dokus fast immer auf die entsprechenden Hexadezimalen Fehlerwerte. Als Hilfe dazu dient mein Error Code Calculator:


ErrorCode (Dez):        ErrorCode (Hex)

Eigentlich werden die Fehlercodes als 32 Bit lange DWORDs angegeben. Bei Laufzeitfehlern werden die Codes als negative Dezimalzahlen ausgegeben - eine Eigenheit des verwendeten Datentyps "Signed Integer". Im MSDN werden aber positive Hex-Werte als Errorcodes dokumentiert. Die Umrechnung zwischen Dezimal- und Hexwert geschieht wie folgt: Man addiert zum negativen Dezimalwert die Zahl 4294967296 hinzu. Es handelt sich um die Hex-Zahl 0x100000000 - dies ist die Grenze, ab der im DWORD-Zahlenraum die negativen Zahlen repräsentiert werden. Den erhaltenen Wert kann man dann in eine Hex-Zahl umwandeln - diese repräsentiert genau den offiziellen Hex-Fehlercode.

Beispiel:

Laufzeitfehler    -2147217911 (dec)
+                         4294967296 (dec)
______________________________
=                         2147749385 (dec) => 0x80040E09 (hex)


Laufzeitfehlerbehandlung für ADSI in Scripts


Damit bei Problemen in ADSI-Aufrufen ein Visual Basic Skript nicht mit einem Laufzeitfehler abbricht, verwendet man das Konstrukt OnError Resume Next. In diesem Fall läuft das Skript weiter, wobei in der System-Variable Err.Number ein Fehlercode und mit Err.Description dessen System-Beschreibung ausgelesen werden kann.

So sollte man z.B. jeden wichtigen ADSI-Aufruf im Skript gegen Laufzeitfehler absichern:


On Error Resume Next Err.Clear Set user = GetObjekt("LDAP://dc1.cerrotorre.de/cn=Michael Sandt,ou=Consultants,dc=cerrotorre,dc=de" If (Err.number <> 0) Then WScript.Echo "Fehler: " & Err.Number WScript.Echo Err.Descritption Wscript.Quit 2 End If user.DisplayName = "Lars Bauer (Vancouver)" Err.Clear user.Setinfo If (err.number <> 0) Then WScript.Echo "Fehler: Attribut konnte nicht geschrieben werden" Wscript.Quit 3 End If