admin管理员组文章数量:1648462
前言:刚开始整理MS AD域属性时,对accountExpires这些字段大整数让人觉得很奇怪,明明名称显示应该该属性是一个时间相关类型,数值看起来又不像-_-着手对此字段实现更新功能时,尝试写入标准时间类型和字符串类型,都会报出异常。
查阅了相关资料发现,AD中时间属性有两种类型。
一、通用标准类型-Generalized Time/Universal time 类型
这种以whenCreated、whenChanged属性为代表,这种属性的类型是真正的时间类型。
格式的核心是由ISO8601定义的,W3上的 Date and Time Formats一文介绍得比较易读。不过实际使用的格式不包括横线、冒号等分隔符,具体格式是由ITUX680规定的(在64~65页)。
概括起来,这种格式就是年月日时分秒连续地写在一起,加上一个小数点后的秒值(一般为0),再加上时区,小数点和时区都不可省略。
对于UTC时间,它就形如:20090502173227.0Z
对于本地时间,它就形如:20090503013227.0+0800 (这两个时间是同一个)
一般来说,向AD中写入时,可以用本地的表示也可以用UTC的表示,但是读出来的时候,都是UTC表示(也就是以Z结尾的)
二、NT时间戳型
以lastLogon、pwdLastSet、accountExpires等属性为代表,这类属性的类型(syntax)其实就是一个大整数。NT时间戳与Unix时间戳的思想是一样的,只是前者的定义更bt一些:从1601年1月1日0时起经过的1E-7秒(即100纳秒)的个数(时间是GMT的)。
===========================================================================================
Java Date类型转NT时间戳代码:
/**
*
* @Title: getNTLongTimestamp
* @Description: 根据传入Date类型时间,计算NT类型时间戳
* @param @param date
* @param @return 设定文件
* @return long 返回类型
* @throws
*/
public static long getNTLongTimestamp(Date date) {
long timestamp = date.getTime();
timestamp -= 57599875L;
timestamp *= 10000;
timestamp += 116445312000000000L;
return timestamp;
}
代码计算出的数值,在在线工具验证会有小时方面的误差,但是日期无误,后期需要再调整细节(已解决,代码片段已更新!)
链接:NT时间戳转换
本文标签: 属性时间ldapaccountExpiresNT
版权声明:本文标题:【LDAP】accountExpires属性更新--NT时间戳 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1729497464a1203083.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论