Zeitumrechnung von LastLogonTimeStamp

  • Liebe AutoItler!

    Scheinbar bin ich zu doof eine Umrechnung von einem Timestamp aus dem AD korrekt umzurechnen. Ich habe mir die Finger bis jetzt Wundgegoogelt und auch die Forumsuche gequält...leider war für mich nichts verwertbares dabei!

    Folgendes Problem habe ich zu lösen:

    Ich möchte von einem Domaincontroller das letzte Logon eines Client (PC) ermitteln. Dazu lese ich das Attribut "LastLogonTimeStamp" aus. Leider wird das in einem 100ms 64Bit Zahl zurückgegen das die vergangene Zeit seit 1.1.1600 wiedergibt (wer hat sich nur so einen Schwachsinn ausgedacht :S )

    Als Output bekommt man z.B. 130886109585119932. Diese Zahl läßt sch jetzt mit w32tm /ntte 130886109585119932 auf ein sprechndes
    Datum/Zeit-Format umrechnen: 151488 13:15:58.5119932 - 06.10.2015 15:15:58


    Soweit alles ok. Wenn ich das aber über ein Dos (StdoutRead) umrechnen lasse, läuft mein Programm ca. gute 30 Minuten (für rund 20000 Clients) - das ist zulange!

    Ich habe auch diverse Versuche mit dem AD.UDF gemacht - auch nicht schneller!

    Bitte um Hilfe!

    lg
    Racer

    • Offizieller Beitrag

    100ms 64Bit Zahl zurückgegen das die vergangene Zeit seit 1.1.1600

    ??
    Soweit ich weiß, sind es 100 ns - Intervalle seit dem 1.1.1601 0:00 Uhr. ("w32tm /ntte" weiß das ja ;) )
    Zu beachten ist dabei auch, dass "LastLogon" und "LastLogonTimeStamp" nur alle 14 Tage synchronisiert werden! Um den aktuellsten Wert zu finden, musst du jeden Domänencontroller im Netzwerk abfragen.


    30 Minuten (für rund 20000 Clients)

    Rund 90 ms pro Client halte ich nicht für übermäßig langsam.

  • Du hast natürlich recht: es sind 100ns!
    Ich weiß das die Daten nicht 100% sind, aber un Altlasten im AD festzustellen gut genug!

    Es hilft mir aber nicht wenn es pro Client nur wenig Zeit ist, aber in Summe recht lange dauert. Insbesonders wenn ich die Daten in 15Sekunden dumpen kann und dann eine Ewigkeit brauche um die Zeit über einen Prozess umzurechnen.

    Daher war meine Frage ob Du/Jemand eine bessere Methode weiß bzw. vielleicht eine Formel oder gar ein UDF dafür hat!

    lg
    Racer

    • Offizieller Beitrag

    Das umrechnen kann man ja auch mit AutoIt machen:

    AutoIt
    #include <Date.au3>
    $iTimer = TimerInit()
    $iTimestamp = 130886109585119932
    $iSeconds = Int($iTimestamp * 1e-7) ; 100 ns in Sekunden
    $sNewDate = _DateAdd('s', $iSeconds, '1601/01/01 00:00:00')
    ConsoleWrite(TimerDiff($iTimer) & '   ' & $sNewDate & @CR)

    Das braucht auf meinem Rechner nur ca. 0.3 ms für die Umrechnung.

  • Wenn Du nur Altlasten feststellen willst, dann ist es ja eigentlich egal, wie lange das Skirpt läuft, oder?
    _AD_GetLastLoginDate sollte alos völlig ausreichen und lässt sich sogar noch über Parameter einschränken, was die Laufzeitweiter verkürzt.
    Wie hast Du _AD_GetLastLoginDate bisher aufgerufen?

  • Guten Morgen!

    Oscar : vielen Danke - das ist ganau was ich gesucht habe...werde das Script gleich im laufe des Tages testen!

    water: Naja, so ganz einfach ist das nicht. Das Script verwenden Kollegen von mir und wenn das recht lange braucht kommt der menschliche Faktor (=ungedult) dazu.

    Wie mach ich das bisher? Ganz einfach:

    Bash
    dsquery * "dc=meine,dc=domain,dc=at" -attr "cn" "operatingsystem" "operatingsystemversion" "distinguishedname" "LastLogonTimeStamp" -limit 0 -filter "(&(objectclass=computer)(operatingsystem=windows 7*"))

    Den Output in eine Datei umleiten und das geht sehr sehr schnell! Danach wird die Datei in AutoIT eingelesen - ich habe mir ein Fastload gebastelt das die Datei sehr schnell einlesen kann (möglicherweise gibt es hier schon ein fertiges UDF).

    lg
    Racer

    Ergänzung: Nachdem ich den Code von Osacr in eine Funktion übernommen habe ist die Laufzeit bei der Abfrage von ~30 Minuten auf unter 1 Minute geschrumpft - das nenne ich Optimierung :)

    Einmal editiert, zuletzt von Racer (27. Oktober 2015 um 08:27)