Microsoft Timestamp / Interval Attribute mit Integer8 Syntax
Auf dieser Webseite wollen wir einen Blick auf diejenigen numerischen Verzeichnis-Attribute werfen, die von Microsoft dazu verwendet werden, um Datum und Zeit anzugeben, oder um Zeitintervalle auszudrücken. Beispiele für derartige Attribute:
accountExpires | User objects Computer objects |
Das Datum und die Uhrzeit, ab der der betreffende Account nicht mehr verwendet werden kann. |
badPasswordTime | User objects Computer objects |
Das Datum und die Uhrzeit zu der der betreffende Acount das letzte Mal ein falsches Passwort eingegeben hat. |
lastLogoff | User objects Computer objects |
Das Datum und die Uhrzeit, zu der der betreffende Acount sich das letzte Mal abgemeldet hat (wird in den derzeitigen AD Versionen nicht verwendet). |
lastLogon | User objects Computer objects |
Das Datum und die Uhrzeit, zu der der betreffende Acount sich das letzte Mal am DC angemeldet hat (wird NICHT zwischen Domänencontrollern repliziert - wenn man die genaue Anmeldezeit eines Benutzers herausfinden will, muß man diesen Wert deshalb von allen Domänencontrollern abfragen). |
lastLogonTimestamp | User objects Computer objects |
Das Datum und die Uhrzeit, zu der der betreffende Acount sich das letzte Mal an der Domäne angemeldet hat. Der Wert lastLogonTimestamp wird zwischen Domänencontrollern repliziert, jedoch nur wenn das enthaltene Datum älter als 2 Wochen ist - dies vermeidet Replikationsverkehr zwischen den DCs, zeigt uns jedoch die Accounts, die schon seit längerem nicht mehr aktiv waren. |
lockoutDuration | Domain objects | Dies ist das Zeitintervall, das bestimmt wie lange ein Konto durch den Intruder Lockout Mechanismus (=Kontosperrung) gesperrt wird. |
lockOutObservationWindow | Domain objects | Dies ist das Zeitintervall, in dem ein Benutzer nicht zu oft ein falsches Passwort eingeben darf, ohne vom Intruder Lockout Mechanismus (=Kontosperrung) gesperrt zu werden. |
lockoutTime | User objects Computer objects |
Für gesperrte Accounts ist dies das Datum und die Uhrzeit der Sperre. |
maxPwdAge | Domain objects | Dies ist das Zeitintervall, das das maximale Alter für Kennwörter in der betreffenden Domäne bestimmt. |
minPwdAge | Domain objects | Dies ist das Zeitintervall, das das minimale Alter für Kennwörter in der betreffenden Domäne bestimmt. |
msDS-LastFailed InteractiveLogonTime |
User objects |
Das Datum und die Uhrzeit, zu der der betreffende Account sich zum lezten Mal fehlerhaft versucht hat, an der Domäne anzumelden. Dieser Wert ergibt bei LDAP-Anfragen in AD-Versionen älter als Windows Server 2008 keinen Inhalt. |
msDS-LastSuccessful InteractiveLogonTime |
User objects |
Das Datum und die Uhrzeit, zu der der betreffende Account sich zum lezten Mal erfolgreich an der Domäne angemeldet hat. Dieser Wert ergibt bei LDAP-Anfragen in AD-Versionen älter als Windows Server 2008 keinen Inhalt. |
msDS-UserPassword ExpiryTimeComputed |
User objects Computer objects |
Das Datum und die Uhrzeit, zu der das Passwort des betreffenden Accounts ablaufen wird. Dieses Constructed Attribut wird auf der MSDN Website beschrieben, ergibt jedoch bei LDAP-Anfragen in AD-Versionen älter als Windows Server 2008 keinen Inhalt. |
pwdLastSet | User objects | Das Datum und die Uhrzeit, zu der das Passwort des betreffenden Accounts das letzte Mal geändert wurde. |
Der grundlegende LDAP Attribut-Datentyp für derartige Attribute ist eine Microsoft-proprietäre LDAP attribut syntax, die Large Integer genannt wird - oft wird auch von Integer8 gesprochen, weil es sich um einen numerischen Signed Integer Wert handelt, der 8 Byte (64 Bit) lang ist. Der mögliche Zahlenbereich für einen Microsoft Integer8 Wert ist dieser:
Kleinster Wert: -9223372036854775808 (-2^63) oderr hex 0x8000000000000000 |
Größter Wert: 9223372036854775807 (2^63 - 1) oderrhex 0x7FFFFFFFFFFFFFFF |
Wie kommt Microsoft nun dazu, dieser wahrhaft riesigen Zahlenwerte zur Angabe von Datums- und Zeitwerten oder als Zeitintervall zu verwenden? Ganz "einfach":
- In einigen Fällen wird ein Integer8 Wert als Datum- und Zeit-angabe interpretiert. Hierbei kann der Wert als eine Microsoft Filetime Struktur gelesen werden, die die 100-Nanosekunden-Abschnitte seit dem 1. Januar 1600, 12:00 angibt.
- In anderen Fällen kann ein Integer8 Wert als Zeitintervall interpretiert werden, es handelt sich dann stets um eine negative Zahl. Ihren Absolutwert kann man als eine Microsoft Filetime Struktur lesen, die das Zeitintervall nach der Anzahl der darin enthaltenen 100-Nanosekunden-Schritte angibt.
Ind er ADSI-Schnittstelle werden Integer8-Werte in From von zwei 32Bit-Teilwerten behandelt: dem so genannten HighPart und dem LowPart. Sie sollten dabei beachten, dass alle Datums- und Zeitangaben in der Active Directory Datenbank intern im UTC Zeitformat gespeichert werden (Universal Coordinated Time) - das ist (fast) das gleiche wie die frühere Greenwich Meantime (GMT). Wenn Sie also ein System in der mitteleuropäische Zeitzone zur Sommerzeit betreiben (MEZ, das ist GMT + 2), so müssen Sie die Integer8 Attributwerte entsprechend umrechnen, wenn Sie sie in lokaler Zeit sehen wollen.
Ein anderes wichtiges Detail: Sie müssen unbedingt die GetEx Medthode verwenden, um einen Large Integer/Integer8 Attribut in einm ADSI Script lesen wollen. Wenn Sie dies mit einem normalen Get verseuchen, werden Sie diesen Laufzeitfehler bekommen: 0x800a01b6 (-2146827850) METHOD_OR_PROPERTY_NOT_SUPPORTED.
Also, hier ist der Script Code, um einen Integer8 Wert in Datum und Uhrzeit umzurechnen, inklusive der Anpassung an die lokale Rechnerzeit (wir nehmen die Zeitabweichung von UTC direkt aus der Registry). Eine andere Funktion zeigt, wie man ein Datum in einen Integer8 umwandelt.
Werkzeuge für die Konvertierung von Large Integer / Integer8 in Datum+Zeit
Es gibt mehrere andere Werkzeuge für die Umwandlung eines Microsoft Large Integer in einen Datum+Uhrzeit Wert.
LEX - The LDAP Explorer
LEX - The LDAP Explorer (ein leistungsfähiger kommerzieller LDAP Browser, den ich entwickelt habe) hat spezielle Attribut-Editoren für Large Integer Attribute, die als Timestamps bzw. Intervalle behandelt werden müssen:
LEX Editor für Microsoft Integer8 Timestamps:
LEX Editor Für Microsoft Integer8 Intervalle:
W32TM
Sie können auf jeder Windows Eingabeauffroderung seit Windows Server 2003 den Befehl W32TM.EXE verwenden, um einen Integer8 Wert in einen Datum+Uhrzeit Wert. Sie müsen dafür folgende Syntax verwenden:
W32TM /ntte <integer8-value>
REPADMIN
Sie können auf der Windows Eingaeaufforderung jedes Domänencontrollers das Kommando REPADMIN.EXE für di Konvertierung verwenden (auf Windows 2000/2003 Servern müssen Sie zuerst das Resource Kit installieren). Verwenden Sie für die Konvertierung folgende Syntax:
REPADMIN /showtime <integer8-value>
sie müssen dabei jedoch die letzten 7 Ziffern des Large Integer Wertes weglassen, denn REPADMIN will die Umrechnung anhand von Sekunden (und nicht von Nanosekunden) durchführen: