正在寻找有关Active Directory日期时间格式的帮助,特别是属性lastlogondatetimestamp。
根据谷歌的说法,Active Directory的LastLogonTimeStamp属性以System.Int64数据类型格式存储最后一个登录时间戳值。此时间戳是自1601年1月1日UTC以来的100纳秒间隔数。
我如何转换/评估它,以便查看最后登录数据时间戳是否超过90天?我不会在任何地方显示数据,只需要在结果超过90天时采取行动,从我的应用程序中清除旧用户帐户。
我试过这个:
startDate = createdatetime( '1601','01','01','00','00','00' ); dateConvert( "utc2Local", dateadd( 's', arguments.lastlogondatetimestamp, startDate ) );
,但我的结果是:
{ts '124795117-01-18 18:00:18'}
,告诉我做错了什么。
我也尝试过startDate = createdatetime( '1601','01','01','00','00','00' ); datetimeNow = dateConvert( "local2Utc", now() );
,但当我转储datediff( 's', startdate, datetimeNow );
时,我不清楚如何处理返回的值。
更新我后来了解到Lucee 5中不提供日期转换。
以下是我如何使用Windows时间服务(w32tm.exe(解决此问题的。
- 查询数据库以获取应用程序中的用户
- 循环结果
- 查询ldap并返回LastLogonTimestamp
- 将LastLogonTimestamp传递给helper函数(请参阅下面的内容(,该函数返回一个文本字符串,其中包括一个可以求值的日期时间字符串
- 解析从结果返回的时间戳(连字符上的listlast对我有效(
- 它看起来像:
567890 20:14:47.6024208 - 9/1/2022 3:14:47 PM
- 它看起来像:
- 获取now((和时间戳之间的日期差
- 如果结果是某个值,则采取进一步行动
- 如果结果是lte某个值,不需要任何操作
在我的用例中,我只查找了大约1千个用户,而且是在几个小时后通过预定任务完成的。
我也不必处理闰年、舍入误差等。;我所需要做的就是比较两次约会。
Helper函数(这才是真正回答这个问题的原因(:
function w32tm(timestampcode){
fileWrite( "foldernamew32tm.cmd", "c:windowssystem32w32tm.exe /ntte #arguments.timestampcode# > #expandPath('foldernamew32tm-results.txt')#" );
cfexecute(
name="C:WindowsSystem32cmd.exe"
arguments="/C #expandPath('foldernamew32tm.cmd')#"
timeout="#settings.timeout#"
terminateOnTimeout="true"
);
local.rtn.w32tm_response = fileRead("#expandPath('foldernamew32tm-results.txt')#", "utf-8");
return local.rtn.w32tm_response;
}