如何评估Lucee 5.x中的Active Directory lastlogondatatimestamp



正在寻找有关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(解决此问题的。

  1. 查询数据库以获取应用程序中的用户
  2. 循环结果
    1. 查询ldap并返回LastLogonTimestamp
    2. 将LastLogonTimestamp传递给helper函数(请参阅下面的内容(,该函数返回一个文本字符串,其中包括一个可以求值的日期时间字符串
    3. 解析从结果返回的时间戳(连字符上的listlast对我有效(
      • 它看起来像:567890 20:14:47.6024208 - 9/1/2022 3:14:47 PM
    4. 获取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;
}

最新更新