1

Windows NT のシャットダウン時刻を日付と時刻に変換したい:

88 33 9d cb 38 36 d0 01 --> 88339dcb3836d001 --> 22.01.2015 11:44:35 (UTC)

入力データは、この 64 ビットの 16 進数値 (8 バイト) です。この値は、Windows レジストリの にありますHKLM\SYSTEM\ControlSet001\Control\Windows --> Shutdown Time。この値には、前回のシャットダウンの日時が含まれます。値のタイプはFILETIME- 1601 年 1 月 1 日の午前 0 時 UTC からの 100 ナノ秒間隔の数を表す 64 ビットの時間値 (16 進値、リトル エンディアン) です。

これはシェル (bash) 経由で可能ですか? シェルスクリプトで実装したいと思います。

4

2 に答える 2

2

質問に書かれているように、Windows NT シャットダウン時間は 1601 年 1 月 1 日からの 100ns 間隔のカウントです。唯一の問題は、タイムスタンプがリトルエンディアンとしてエンコードされていることです。タイムスタンプをデコードしてエポックに追加することは、純粋な Bash では少しトリッキーですが、Python のインストールを惜しまなければかなり簡単になります。

変換を行うスクリプトは次のとおりです。

#! /usr/bin/python3

from __future__ import division
import struct
import sys
from binascii import unhexlify
from datetime import datetime, timedelta

nt_timestamp = struct.unpack("<Q", unhexlify(sys.argv[1]))[0]
epoch = datetime(1601, 1, 1, 0, 0, 0)
nt_datetime = epoch + timedelta(microseconds=nt_timestamp / 10)

print(nt_datetime.strftime("%c"))

引数として 64 ビット値を受け入れ、エンコードされた日付のロケール表現を出力します。

$ ./nttime.py 88339dcb3836d001
Thu Jan 22 11:44:35 2015

別の形式が必要な場合は、標準のstrftime()形式指定子を使用して最後の行を編集します。

于 2015-06-06T10:35:20.723 に答える