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:
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. |
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:
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: