将 REG_BINARY 值(64 位十六进制值 - Little Endian)转换为日期和时间

Convert REG_BINARY value (64 bit Hex Value - Little Endian) to date and time

我想将 Windows NT 关机时间转换为日期和时间:

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

输入数据是这个 64 位十六进制值(8 字节)。您可以在 HKLM\SYSTEM\ControlSet001\Control\Windows --> Shutdown Time 下的 windows 注册表中找到该值。该值包含上次关机的时间和日期。该值的类型为 FILETIME - 一个 64 位时间值(十六进制值,Little Endian),表示自 1601 年 1 月 1 日午夜 UTC 以来的 100 纳秒间隔数。

这可以通过 shell (bash) 实现吗?我想在 shell 脚本中实现它。

正如问题中所写,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() 格式说明符编辑最后一行。

分享更多知识:-)

$regKey = Get-ItemProperty -Path
Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Windows
$shutDown = $regKey.ShutdownTime
$Int64Value = [System.BitConverter]::ToInt64($shutDown, 0)
$date = [DateTime]::FromFileTime($Int64Value)

$date

收到这个