Printout Header
RSS Feed

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) oderr
hex 0x7FFFFFFFFFFFFFFF

 

 

Wie kommt Microsoft nun dazu, dieser wahrhaft riesigen Zahlenwerte zur Angabe von Datums- und Zeitwerten oder als Zeitintervall zu verwenden? Ganz "einfach":

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.

'hier müssen Sie einen Distinguished Name eines Benutzers Ihrer eigenen Umgebung einsetzen! Set obj = GetObject("LDAP://cn=Administrator,cn=Users,dc=cerrotorre,dc=de") Set llValue = obj.Get("lastLogon") 'nicht vergessen: mit 'SET' ein Object erzeugen WScript.Echo LargeIntegerToDate(llValue) 'zeigt den Integer8 Wert des aktuellen Datums+Uhrzeit... WScript.Echo DateToLargeIntegerString(Now) Function LargeIntegerToDate(value) 'nimmmt einen Microsoft LargeInteger Wert (Integer8) und gibt das entsprechende Datum plus Uhrzeit zurück 'erst die lokale Zeitabweichung aus der Registry auslesen Set sho = CreateObject("Wscript.Shell") timeShiftValue = sho.RegRead("HKLM\System\CurrentControlSet\Control\TimeZoneInformation\ActiveTimeBias") If IsArray(timeShiftValue) Then timeShift = 0 For i = 0 To UBound(timeShiftValue) timeShift = timeShift + (timeShiftValue(i) * 256^i) Next Else timeShift = timeShiftValue End If 'der Large Integer wird mit zwei Long Werten gehandhabt (HighPart und LowPart) i8High = value.HighPart i8Low = value.LowPart If (i8Low < 0) Then     i8High = i8High + 1 End If 'das Datum und die Uhrzeit ausrechnen: 100-Nanosecond-Schritte seit dem 1. Januar 1601 If (i8High = 0) And (i8Low = 0) Then LargeIntegerToDate = #1/1/1601# Else LargeIntegerToDate = #1/1/1601# + (((i8High * 2^32) + i8Low)/600000000 - timeShift)/1440 End If End Function Function DateToLargeIntegerString(value) 'nimmt ein Datun+Uhrzeit und gibt den entsprechenden Microsoft LargeInteger Wert (Integer8) zurück 'erst die lokale Zeitabweichung aus der Registry auslesen Set sho = CreateObject("Wscript.Shell") timeShiftValue = sho.RegRead("HKLM\System\CurrentControlSet\Control\TimeZoneInformation\ActiveTimeBias") If IsArray(timeShiftValue) Then timeShift = 0 For i = 0 To UBound(timeShiftValue) timeShift = timeShift + (timeShiftValue(i) * 256^i) Next Else timeShift = timeShiftValue End If 'die Zeit von lokaler Zeit in UTC umrechnen value = DateAdd("n", timeShift, value) 'wieviele Sekunden seit 1601 sind vergangen? secs = DateDiff("s", #1/1/1601#, value) 'in Nano-Sekunden umrechnen DateToLargeIntegerString = CStr(secs) & "0000000" End Function

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:

Screenshot: Integer8 Attributes in the LEX LDAP Browser

LEX Editor für Microsoft Integer8 Timestamps:

Screenshots: Integer8 Attribute Editors for timestamps in LEX - The LDAP Explorer

LEX Editor Für Microsoft Integer8 Intervalle:

Screenshots: Integer8 Attribute Editors for intervals in LEX - The LDAP Explorer


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>

Screenshot: Integer8 Attribute Conversion with W32TM


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:

Screenshot: Integer8 Attribute Conversion with REPADMIN