gpt4 book ai didi

python - Winreg Python,QueryInfoKey 为上次更改提供了不正确的日期/时间?

转载 作者:可可西里 更新时间:2023-11-01 10:32:25 25 4
gpt4 key购买 nike

我有一个循环遍历包含找到的注册表项路径的列表的函数。我现在需要从该注册表项列表中找到每个注册表项的最后更改日期。

def get_values(subkeylist):
try:
x = 0
nanos = []
while x < len(subkeylist):
keypath = subkeylist[x]
key = OpenKey(HKEY_CURRENT_USER, keypath, 0, KEY_ALL_ACCESS)
secs = QueryInfoKey(key)[2] / 1e9
dt = datetime.fromtimestamp(secs)
dt.strftime('%Y-%m-%dT%H:%M:%S.%f')
print(dt)
x += 1
except WindowsError:
pass

我觉得我在这里做错了什么,或者 key 中保存的值不正确。 shell中的输出如下:

1974-03-04 05:54:37.4813531974-03-04 05:54:37.4814331974-03-04 05:54:37.481443

这里是自 EPOCH 1601 以来转换前的实际输出(以纳秒为单位)。(QueryInfoKey:一个整数,表示自 1601 年 1 月 1 日以来上次修改 key 的时间(如果可用)为 100 纳秒)。

131608477481353446131608477481433451131608477481443451

最佳答案

正如您所指出的,注册表似乎将时间戳存储在 FILETIME structure 中格式,而 Python 的日期和时间函数需要 Unix 时间戳,即自 1970 年 1 月 1 日以来的数。

如果将 01.01.1601 + (131608477481353446 * 100 ns) 插入 WolframAlpha,您将看到它转换为 2018 年 1 月 19 日,因此键中的值似乎是正确的,您只需需要正确解码。

from datetime import datetime, timedelta

WIN32_EPOCH = datetime(1601, 1, 1)

def dt_from_win32_ts(timestamp):
return WIN32_EPOCH + timedelta(microseconds=timestamp // 10)

key = OpenKey(...)
ts = QueryInfoKey(key)[2]
dt = dt_from_win32_ts(ts)
print(dt.strftime('%Y-%m-%dT%H:%M:%S.%f'))
# 2018-01-19T15:02:28.135344

Python 的datetime 模块支持微秒精度,这意味着我们失去了一位小数点的精度。

关于python - Winreg Python,QueryInfoKey 为上次更改提供了不正确的日期/时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48355960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com