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