Blog

Hier blogge ich über Themen, die mich - und vielleicht auch andere - interessieren (könnten)

Installationszeitpunkt von DSM Paketen

Vermutlich jeder NetInstall- / Enteo v6- / DSM 7-Administrator hat sich schonmal die Registry auf den gemanageten Clients unterhalb von Software\NetSupport\NetInstall\Installed Apps angeschaut, weil ja dort die ganzen Infos über die auf dieser Maschine bzw. für einen Benutzer ausgeführten Pakete hinterlegt sind.

Unter anderem gibt's dort auch einen Value LastInstallTime, in dem der Zeitpunkt der letzten Installation des jeweiligen Paketes hinterlegt ist. Allerdings ist dieser Wert vom Typ "Time_t" und wird in einem Byte-Array gespeichert, das die Anzahl der Sekunden seit dem 01.01.1970 angibt und ist damit für den durchschnittlich begabten Systemadministrator (oder Consultant – wie mich) eher nicht lesbar... ;-)

Um dieses Byte-Array nun in eine normale Datum-Uhrzeit-Kombination umzuwandeln, gibt es verschiedene Wege:

  1. die NWC Services stellt Ihnen im Downloadbereich das kostenlose Kommandozeilen-Tool "TimeConv" zur Verfügung, mit dem Sie diese Umrechnung durchführen können. Rufen Sie dazu TimeConv.exe mit dem Wert aus LastInstallTime auf. Dabei ist darauf zu achten, dass Sie – da es sich um einen hexadezimalen Wert handelt – ein 0x voranstellen. Außerdem müssen Sie die vier Bytes "von hinten nach vorne" (das höchstwertige Byte steht ganz am Ende) und ohne Leerzeichen dazwischen übergeben.

    Beispiel: in der Registry finden Sie den Wert "45 86 ad 4d". Rufen Sie dann TimeConv in einem Shell-Fenster folgendermaßen auf:

    timeconv 0x4dad8645


    In dem Output sehen Sie unter anderem die Zeile Unix date and time: – der darin angzeigte Wert, entspricht dem Datum und der Uhrzeit (mit der zu diesem Zeitpunkt gültigen Sommer- bzw. Winterzeit-Einstellung und in Abhängigkeit der Systemzeit und Zeitzone). Im obigen Beisiel wurde das Paket also am Dienstag, 19. April 2011 um 14:55:33 Uhr installiert.
  2. Wenn Sie bereits mit PowerShell arbeiten, können Sie natürlich auch die Möglichkeiten des .NET-Frameworks nutzen, um die Konvertierung der Zeitwerte durchzuführen. Die untenstehende Funktion entspricht in etwa dem Funktionsumfang von TimeConv.exe. Die können diese Funktion leicht in Ihr eigenes Script übernehmen und dort aufrufen:

    function TimeTToDateTime($hex = $null, $int = $null)
    {
    $time_t = $null;
    if ($hex -ne $null) { $time_t = [Convert]::ToUInt32($hex, 16); }
    elseif ($int -ne $null) { $time_t = [Convert]::ToUInt32($int, 10); }
    else { Write-Error "Need input ..."; return ; }
    return [DateTime]::Parse("1970-01-01T00:00:00").AddSeconds($time_t);
    }

    Der Aufruf der Funktion innerhalb Ihres Scripts geschieht dann auf eine der in den folgenden Beispielen gezeigten Möglichkeiten:
    TimeTToDateTime 0x4dad8645
    TimeTToDateTime 4dad8645
    TimeTToDateTime -int 1303217733

    Sollten Sie auch Bedarf an der Umkehrfunktion haben, also einen Datumswert in einen Time_t Wert umwandeln zu müssen, verwenden Sie einfach die folgende Funktion:

    function DateTimeToTimeT($dateTime)
    {
    return [Convert]::ToUInt32([Math]::Abs(($dateTime - [DateTime]::Parse("1970-01-01T00:00:00")).TotalSeconds));
    }

    und rufen Sie sie beispielsweise so auf:
    DateTimeToTimeT ([DateTime]::Now)
    (DateTimeToTimeT ([DateTime]::Now)).ToString("X8")
PowerShell-Scripts in DSM 7 (Teil I)
Packaging.Docs - Checkliste für die Paketierung
 

Kommentare

Derzeit gibt es keine Kommentare. Schreibe den ersten Kommentar!
Bereits registriert? Hier einloggen
Gäste
Montag, 23. Mai 2022

Sicherheitscode (Captcha)