Alien的博客

使用ldap语句查询某时间后没改密码的用户

经常使用Active Directory用户和计算机控制台的我们会发现,在左侧控制台树的最上面有一个“保存的查询”,通过新建查询可以看到可以通过图形界面创建一些简单的查询操作。

那么我们如果有一些特殊的查询要做要怎么来实现呢。这里我们把《查询某个时间点后没有改过密码的用户》来做为案例来简单说明一下如何使用LDAP命令在AD控制台上来建立查询。

一、关于在AD中密码修改的信息的存储格式

在活动目录中存储的时间戳跟我们日常使用的时间戳是不一样的,活动目录时间戳的存储方式为:“从1601年1月1号0时起所经过的100纳秒的个数”,比如修改密码时间的属性LastPwdSet、用户在域控上最后一次登录认证的属性LastLogon等都是以这种格式来保存的
看起来还是挺费劲的,我们来通过实例来计算一下可以更好的理解他们之间的转换方式

例如:我们要把2013年6月1日0时转换为活动目录时间戳
首先我们要计算从从1601年1月1号0时到2013年6月1日0时所经过的秒数。这个我们通过工具来计算
http://www.zhongguosou.com/education_graduate_course_tools/time_date_difference.html

如上图,通过这个网站可以计算出他们之间所经过的秒数为:13014518400秒
之后再把单位转换为纳秒


13014518400秒*1000000000/=13014518400000000000纳秒


最后转换为活动目录时间戳


13014518400000000000纳秒/100纳秒=130145184000000000


好了,得到的一串数字就是活动目录时间戳,我们来验证一下是否正确,看是否能把它转换成标准时间,转换会标准时间就比较简单了,通过windows自带的命令就可以做到

看上图中标红的地方,说明我们的时间戳的转换是成功的。
PS:由于使用这个命令转换出来的时间为GMT时间格式,他会自动根据我们当前计算机的时区再做一次计算,得出2013/6/1 8:00:00的时间,因为我们转换前活动目录时间戳的时区就是我们当前的时区,所以可以忽略掉他自动转换的时区。

二、LDAP查询语句

把时间戳之间格式转换搞明白了之后,我们就可以创建LDAP查询语句了
按照我们例子中的要求:查询某个时间点后没有改过密码的用户。
查询语句如下:


(objectCategory=user)(objectClass=user)(pwdlastset<=时间戳)(!pwdlastset=0)


在这里我们把查询条件设置为最后一次修改密码的时间小于等于我们要查询的时间以及最后一次修改密码时间不为0的用户
(如果用户pwdlastset属性为0,说明用户属性中勾选了“下一次登录必须修改密码”的选项)

三、在AD控制台创建LDAP查询

好了全部的原理都搞清楚了之后,下面可以新建查询了
1. Active Directory用户和计算机,在“保存的查询”中单击右键选择“新建”-“查询”

输入查询名称,并且单击“定义查询”

在“查找”中选择“自定义搜索”,并在“自定义搜索”中选择“高级”标签

把我们在(一)中计算出来的时间戳替换到(二)中的查询语句中,之后再粘贴到当前的对话框中

点击确定后返回“编辑查询”的对话框,检查无误后点击确定保存此查询

返回AD用户和计算机控制台,选择刚才新建的查询,在右侧刷新页面,这时候可以看到我们查询的用户就已经出现在列表了。

四、小结

本文中主要介绍了三个知识点
1. 了解以LastPwdSet、LastLogon等属性在活动目中保存的时间戳格式
2. 活动目录时间戳格式的转换方法
3. 在AD控制台使用简单的LDAP命令查询
在日常管理中,使用在AD控制台使用LDAP查询命令可以帮我们更有效的完成很多事情,这种查询方式的好处就是所有查询结果全部都输出的控制台,我们可以根据需要来手动修改。从而避免了使用其他批量修改脚本所带来的风险。