AD account expires映射ServiceNow sys_user表日期字段脚本问题
AD accountExpires 转 ServiceNow u_account_expiration 脚本修正
问题分析
现有脚本存在以下关键问题导致未达预期:
- 仅通过字符串首字符判断有效值,遗漏了AD
accountExpires字段的其他合法非永不过期值,且未处理AD官方定义的另一个永不过期标记值9223372036854775807 - 未先校验
source.u_accountexpires的数值有效性,若字段为null或非数值类型会直接引发转换错误 - 为空字段赋值时使用空字符串,不符合ServiceNow日期字段的规范操作逻辑
修正后的OnBefore Transform脚本
// 更新ServiceNow账号过期时间字段 var adExpireValue = source.u_accountexpires; // AD accountExpires的两个官方永不过期标记值 var neverExpireValues = [0, 9223372036854775807]; // 校验源字段为有效数值且不属于永不过期情况 if (adExpireValue && !neverExpireValues.includes(parseInt(adExpireValue))) { var dtUtil = new DateTimeUtils(); try { // 将AD的64位整数时间转换为GlideDateTime对象 var gDate = dtUtil.int8ToGlideDateTime(adExpireValue); // AD的accountExpires存储的是到期日次日0点,减1天得到实际到期日期 gDate.addDaysLocalTime(-1); target.u_account_expiration = gDate; } catch (e) { // 转换失败时清空目标字段 target.u_account_expiration.setNull(); } } else { // 永不过期或无有效值时,清空目标字段 target.u_account_expiration.setNull(); }
关键修改说明
- 完善有效值判断:明确AD官方定义的两个永不过期标记,先校验源字段是否为有效数值再执行转换
- 增加异常处理:用try-catch包裹转换逻辑,避免非法值导致的脚本中断
- 规范空值处理:使用ServiceNow官方推荐的
setNull()方法清空日期字段,替代空字符串赋值 - 严谨性提升:先判断源字段存在性,避免null值引发的类型转换错误
内容的提问来源于stack exchange,提问作者Ruchi
相关产品推荐
相关产品推荐

