cancel
Showing results for 
Search instead for 
Did you mean: 

How to convert AD accountexpires in Local timezone format

Ckumar
Contributor
0 Kudos
1,642

Hello Everyone,

In my current project IDM 7.2 SP10, we are reading accountexpires attribute from AD and then converting it to a readable format using uInt8ToDate function.

https://help.sap.com/saphelp_nwidmic71/en/using_functions/internal_functions/dse_uint8todate.htm

This function is converting the date in readable GMT format while client want it in local time. While searching SCN, I got below post which says that "True" switch is not working in uInt8ToDate function and even I observed the same.

https://archive.sap.com/discussions/thread/3469115

Can anyone guide how can I convert the date in local timezone. I tried to use getTimezoneOffset() but it thrown error. Any help with the JavaScript formula will be appreciated.

Accepted Solutions (1)

Accepted Solutions (1)

former_member201064
Active Participant

Hello C Kumar,

I use this script to retrieve the accountExpires from AD and set it to the local validto attribute for AD:

var MSTimestamp = Par;
var MSTimestampNormalized = (MSTimestamp - 116444736000000000 - 864000000000) / 10000;
var date = new Date(MSTimestampNormalized);

date.toGMTString();
var MonthValue = new Array("01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12");
var dayOfMonth = '' + date.getDate();
if (dayOfMonth.length == 1) { dayOfMonth = "0" + dayOfMonth; }
return date.getFullYear() + "-" + MonthValue[date.getMonth()] + "-" + dayOfMonth;

Never thought of the time gap between GMT and CET though. I always take a day of (864000000000) due to the difference from accountExpires and validto.

I guess I would have to add or subtract another milliseconds value to match up the different time zones we have (plants all around the world) if sdomeone actually would complain about a user being locked too early just because of the day hasn't passed yet. I guess the local Domain Controllers in every country handle the date correctly.

If ever needed I would use a time zone difference in hours and store it on each company. Then I'd use this one in the script to add / subtract the amount of hours before calculating the new Date thingy.

Best regards

Dominik

devaprakash_b
Active Contributor
0 Kudos

Hi Dominik,

Can you please let me know how to convert the current date to LDAP/filetime, so that enddate can be passed to the AccountExpires attribute in AD

Regards,

Deva

Answers (1)

Answers (1)

former_member201064
Active Participant
  if (Par.search(" ") > -1){
  Par = Par.split(" ")[0];
 }
 // Add T00:00:00 if needed
 if (Par.search("T") == -1 ){
  Par += "T00:00:00";
 }
 var splitted   = Par.split("T");
 // 1st part
 var splittedDate  = splitted[0];
 splittedDate    = splittedDate.split("-");
 var year    = splittedDate[0];
 var month    = splittedDate[1] - 1; // Minus 1 needed
 var day    = splittedDate[2];
 // 2nd part
 var splittedTime = splitted[1];
 splittedTime   = splittedTime.split(":");
 var hours    = splittedTime[0];
 var minutes   = splittedTime[1];
 var seconds   = splittedTime[2];
 // New date object
 var adDate   = Date.UTC(year, month, day, hours, minutes, seconds);
 adDate    = adDate * 10000 + 116444736000000000 + 864000000000; // Has to be this high!
 // Error handling
 if (adDate == "" || adDate == null || adDate.toString() == "NaN" || Par >= "9999-12-31"){
  adDate   = "9223372036854775807";
 }
 return adDate;

This should help. Parameter can be either formatted like "2018-04-25", "2018-04-25 12:15:00" or "2018-04-25T12:15:00" Please test if it fits your needs. Maybe the calculation of adDate has to be adapted, but it works for me

devaprakash_b
Active Contributor
0 Kudos

Thanks dominik, your script works for any kind of date type.