Fehlercodes mit ERR.EXE auslesen bzw. Fehlertexten zuordnen

Hello again, Fabian hier. Ab und an ist es beim Analysieren von Fehlermeldungen in Netzwerk-Traces, Programmrückgaben, diversen Debug Logs, Ereignisprotokollen etc. notwendig, die internen Error Codes zu überprüfen. Das bedeutet, daß zum Beispiel Ereignisse in den Ereignisprotokollen neben der Event ID oftmals auch direkt Error Codes zurückgeben, die dann benötigt werden, um den Fehler einzugrenzen. Ohne die Einschränkung durch die Error Codes wäre eine Zuordnung des Fehlers anhand der Event ID kaum möglich.

Um die Error Codes aufzulösen, kann man entweder eine Internet-Recherche durchführen oder aber das Microsoft Exchange Server Error Code Look-up Tool benutzen, welches (im Gegensatz zu dem, was der Name suggeriert) die Error Codes verschiedener Quellen auflösen kann und nicht nur die von Exchange. Hierbei ist es möglich, die Error Codes Hexadezimal (etwa "0xc000005e") als auch Dezimal (z.B. "1253") anzugeben.

Als Beispiel sei in aller Kürze ein Ereignis des Security Event Logs genannt:

Date: 09/09/2008
Source: Security
Time: 06:17:33 PM
Category: Account Logon
Type: Failure Audit
Event ID: 675
User: NT AUTHORITY\SYSTEM
COMPUTER: DC1

Description:
Pre-authentication failed:
User Name: user1
User ID: DOMAIN1\user1
Service Name: krbtgt/DOMAIN1
Pre-Authentication Type: 0x2
Failure Code: 0x18 Client Address: 10.10.10.11

For more information, see Help and Support Center at https://go.microsoft.com/fwlink/events.asp .

Möchte man nun wissen, was sich hinter dem Fehlercode “0x18” verbirgt, startet man “err.exe” mit dem Fehlercode als Parameter und erhält die möglichen Fehlertexte bzw. -variablen:

C:\>err.exe 0x18 # for hex 0x18 / decimal 24
BTH_ERROR_PAIRING_NOT_ALLOWED bthdef.h
REFERENCE_BY_POINTER bugcodes.h
CR_APM_VETOED cfgmgr32.h
LLC_STATUS_INVALID_BUFFER_LENGTH dlcapi.h
IAAPI_BADIDENTIFIER iaapi.h
# /* Bad identifier in a parsing display value */
KDC_ERR_PREAUTH_FAILED kerberr.h
# 24 Pre-authentication information was invalid POLICY_ERRV_SUBNET_UNAUTH_USER_FLOW_RATE lpmapi.h
MAPI_DIAG_ALPHABETIC_CHARACTER_LOST mapidefs.h
MSIDBERROR_BADKEYTABLE msiquery.h
# table in KeyTable column of _Validation table could not be
# found/loaded
NRC_SABORT nb30.h
# /* session ended abnormally */
NDDE_CANT_ACCESS_SERVER nddeapi.h
NMERR_OUT_OF_RANGE netmon.h
OLE_ERROR_NOT_LINK, ole.h
# Not a linked object */
ERROR_BAD_LENGTH winerror.h
# The program issued a command but the command length is
# incorrect.
# as an HRESULT: Severity: SUCCESS (0), FACILITY_NULL (0x0), Code 0x18
# for hex 0x18 / decimal 24
ERROR_BAD_LENGTH winerror.h
# The program issued a command but the command length is
# incorrect.
# 15 matches found for "0x18"

Da es sich bei dem Fehler um einen Kerberos Fehler handelt (siehe Ereignis Beschreibung: “Service Name: krbtgt/DOMAIN1”), ist der Fehler der Header Datei “kerberos.h” für uns relevant. Oftmals reicht diese Angabe schon aus, um den Fehler einzugrenzen. Die Zuordnung, zu welchem Fehlertext (in unserem Beispiel dem der “kerberos.h”) ein Error Code gehört, muß man manuell vornehmen. Jedoch ist dies in der Regel kein Problem, da die Event IDs selbst die entsprechenden Hinweise dazu enthalten.

Ist eine Fehlermeldung wie “KDC_ERR_PREAUTH_FAILED” nicht ausreichend, um den Fehler einzugrenzen, kann man beispielsweise den Fehlertext “KDC_ERR_PREAUTH_FAILED” in eine Suchmaschine eingeben. In der Ergebnisliste stößt man dann etwa auf den folgenden KB-Artikel: 230476 Description of Common Kerberos-Related Errors in Windows 2000 https://support.microsoft.com/default.aspx?scid=kb;EN-US;230476, der den Fehlertext wie folgt beschreibt:

0x18 (KDC_ERR_PREAUTH_FAILED) "Pre-authentication information was invalid"
This indicates failure to obtain ticket, possibly due to the client providing the wrong password.

Selbsterklärend oder? ;-)

Ich gebe zu, das Beispiel ist ein wenig konstruiert, da das Security Event mit der ID 675 meist schon ausreichend ist, um auf eine falsche Benutzeranmeldung zu schließen. Außerdem wird in der konkreten Ereignisbeschreibung schon ein Hinweis auf die Ursache gegeben. Trotzdem verdeutlicht das Beispiel, wie man mit ERR.EXE recht problemlos Error Codes auflösen und zuordnen kann und damit oftmals schneller (und bequemer) zum Ziel kommt, als wenn man sich durch die Ergebnislisten seiner bevorzugten Suchmaschine wühlt. Kopiert man sich das Programm ERR.EXE dann noch in ein Verzeichnis, welches als %PATH% im System angegeben ist (z.B. "%SYSTEMROOT%\system32"), kann man unabhängig vom aktuellen Pfad innerhalb der CMD den Aufruf starten.

Viele Grüße, Fabian.