Re: Microsoft Timestamp (Active Directory)

its in this format:
128002727440808261

How do I convert this to something more…nice???

Leave it to Microsoft to come up with something this convoluted:

http://www.microsoft.com/technet/scriptcenter/topics/win2003/lastlogon.m
spx

This seems to work:

require ‘date’

last_logon = 128002727440808261

base = Date.new(1601, 1, 1)
base += last_logon / (60 * 10000000 * 1440)

p base.to_s # “2006-08-17”

Regards,

Dan

This communication is the property of Qwest and may contain confidential
or
privileged information. Unauthorized use of this communication is
strictly
prohibited and may be unlawful. If you have received this communication
in error, please immediately notify the sender by reply e-mail and
destroy
all copies of the communication and any attachments.

Amazing…

Thanks a bunch

Mikkel
On Friday, August 18, 2006, at 3:03 AM, Berger, Daniel wrote:

its in this format:

Dan

This communication is the property of Qwest and may contain confidential or
privileged information. Unauthorized use of this communication is strictly
prohibited and may be unlawful. If you have received this communication
in error, please immediately notify the sender by reply e-mail and destroy
all copies of the communication and any attachments.

Mikkel B.

www.strongside.dk - Football Portal(DK)
ting.minline.dk - Buy Old Stuff!(DK)

Berger, Daniel wrote:

Leave it to Microsoft to come up with something this convoluted:

What could possibly be less convoluted than keeping time as a
high resolution (in this case, 100ns) integer since some epoch?
It’s actually the perfect way to handle time, and I thought
that (and implemented it) long before I knew MS had done it.

On 8/18/06, Clifford H. [email protected] wrote:

Berger, Daniel wrote:

Leave it to Microsoft to come up with something this convoluted:

What could possibly be less convoluted than keeping time as a
high resolution (in this case, 100ns) integer since some epoch?
It’s actually the perfect way to handle time, and I thought
that (and implemented it) long before I knew MS had done it.

Check the NTP protocol. This sounds like the format used by NTP servers.

Daniel M. wrote:

“Berger, Daniel” [email protected] writes:

Leave it to Microsoft to come up with something this convoluted:

At least their time 0 is close to the beginning of a century

Actually it’s at the beginning of a century.

Hal

How did you get the lastlogontimestamp attribute into integer format?

Retrieving myuser.lastLogonTimestamp always gives me:

#WIN32OLE:0x6e39ee0

Which I have no idea how to deal with.

Thanks,

Charles L.

For just documentation purposes - here is some dirty sample code on how
to get a Ruby DateTime from Active Directory:

require ‘win32ole’
require ‘date’

AD4Ruby

require ‘./ad4r/config.rb’

Import namespace for AD4R

include ActiveDirectory

myuser = User.find_by_logon(‘cll13291’)

highpart = myuser.ldap_object.send(“Get”, “lastLogon” ).HighPart
lowpart = myuser.ldap_object.send(“Get”, “lastLogon” ).LowPart

puts "HighPart: " + highpart.to_s
puts "LowPart: " + lowpart.to_s
intLogonTime = highpart * (2**32) + lowpart
puts intLogonTime
intLogonFloat = intLogonTime.to_f / (60 * 10000000 * 1440).to_f
puts “%.9f” % intLogonFloat

last_logon = intLogonFloat

base = DateTime.new(1601,1,1,0,0,0)
base += intLogonFloat

p base
p base.to_s # “2006-08-17T12:37:10Z”

“Berger, Daniel” [email protected] writes:

Leave it to Microsoft to come up with something this convoluted:

At least their time 0 is close to the beginning of a century, the
beginning of a year, and the beginning of the week. (if you begin
weeks on a Monday) They could have chosen to fill their 64-bit time
value with 100ns offsets from 00:00 17-NOV-1858, which isn’t even at
the beginning of anybody’s week. (It’s a Wednesday)

Microsoft even seems to have gone with a pre-existing external
standard in this case.

Parenthetical note:

The date in 1858 is VMS’s time zero - in this case it was also a
pre-existing standard that was followed, based on what astronomers
using computers to track Sputnik used for their time values - see
http://www3.sympatico.ca/n.rieck/docs/calendar_time_y2k_etc.html#nov-17-1858

See also the bottom of rfc868:
http://www.cse.ohio-state.edu/cgi-bin/rfc/rfc868.html

I want to know what systems had time clocks starting 1 Jan 1976; I
assume the 1 May 1983 date is related to the publication date of the
RFC.

I found the following code a bit clearer, but YMMV; this was running
under Linux & just grabbing lastLogin via LDAP.

HTH,

-b

constants for converting to/from AD’s wacky time format

#http://www.irishdev.com/blogs/jbrennan/archive/2005/09/02/973.aspx

was helpful in figuring this out

AD_EPOCH = 116_444_736_000_000_000
AD_MULTIPLIER = 10_000_000

convert a Time object to AD’s epoch

def time2ad(time)
(time.to_i * AD_MULTIPLIER) + AD_EPOCH
end

convert from AD’s time string to a Time object

def ad2time(time)
Time.at((time.to_i - AD_EPOCH) / AD_MULTIPLIER)
end

1 Like