You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确解析LDIF导出的pKIOverlapPeriod为对应天数

问题原因

你的解析逻辑存在两个核心错误:

  • 字节序配置错误:Windows FILETIME结构采用**小端(little-endian)**格式存储64位整数,你代码中指定byteorder = 'big'按大端读取,完全颠倒了字节顺序。
  • 属性语义理解错误:pKIOverlapPeriod和pKIExpirationPeriod这两个AD证书模板属性,存储的不是从1601年起算的绝对时间点FILETIME值,而是带符号的负时间偏移量——值为0减去对应周期的100纳秒间隔总数,用来表示从证书过期时间往前回溯的时长,直接按无符号正数读取会得到远大于实际值的错误结果。
验证计算

以你提供的pKIOverlapPeriod值为例:

  1. Base64字符串AICmCv/e//8=解码后得到8字节:00 80 a6 0a ff de ff ff
  2. 按小端、有符号64位整数读取,得到值:-36288000000000
  3. 取绝对值得到总100纳秒间隔数:36288000000000
  4. 换算天数:1天对应86400 * 10^7 = 864000000000个100纳秒间隔,总间隔数除以单日间隔数得到36288000000000 / 864000000000 = 42,正好匹配你配置的6周(6*7=42天)预期值。

你导出文件里的pKIExpirationPeriod值AEA5hy7h/v8=用同样逻辑计算,得到的结果是2年,符合常规证书模板的有效期配置。

修正后的代码

只需要修改filetime_to_dict函数的解析逻辑即可:

# Converts AD PKI period FILETIME offset to a dictionary.
def filetime_to_dict(filetime):
    # 按小端、有符号64位读取负偏移量,取绝对值得到实际100纳秒间隔数
    intervals = abs(int.from_bytes(filetime, byteorder='little', signed=True))
    return {
        "unit": "days",
        "value": int(intervals // (10**7 * 60 * 60 * 24))
    }

如果需要支持更多单位(周、年)的自动识别,可以在换算后对天数做二次转换,比如天数能被7整除且数值较大时显示为周,能被365整除时显示为年。

内容的提问来源于stack exchange,提问作者user1938742

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 04:33:26