From: Benjamin Ritcey Date: 2007-01-14T12:48:56+09:00 Subject: Re: Microsoft Timestamp (Active Directory) 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 On Fri, 2007-01-12 at 22:54 +0900, Charles Leeds wrote: > 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" > > > > Charles Leeds wrote: > > > > How did you get the lastlogontimestamp attribute into integer format? > > > > Retrieving myuser.lastLogonTimestamp always gives me: > > > > # > > > > Which I have no idea how to deal with. > > > > Thanks, > > > > Charles Leeds > > > > Mikkel Bruun wrote: > >> Amazing... > >> > >> Thanks a bunch > >> > >> Mikkel > >> On Friday, August 18, 2006, at 3:03 AM, Berger, Daniel wrote: > >> > >>>> -----Original Message----- > >>>> From: Mikkel Bruun [mailto:devlists-ruby-talk@devlists.com] > >>>> Sent: Thursday, August 17, 2006 11:43 AM > >>>> To: ruby-talk ML > >>>> Subject: Microsoft Timestamp (Active Directory) > >>>> > >>>> > >>>> Active Directory users contain an attribute called > >>>> lastlogontimestamp... > >>>> > >>>> 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. > >>> > >>> > >> > >> > >> Mikkel Bruun > >> > >> www.strongside.dk - Football Portal(DK) > >> ting.minline.dk - Buy Old Stuff!(DK) > >> > >> > >> > >> > > > > > > > > > > > > >