Microsoft Timestamp (Active Directory)

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

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.

···

-----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???

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:

Microsoft Learn: Build skills that open doors in your career
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)

--
Posted with http://DevLists.com. Sign up and save your mailbox.

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.

"Berger, Daniel" <Daniel.Berger@qwest.com> 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.

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

···

On 8/18/06, Clifford Heath <no@spam.please.net> 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.

Daniel Martin wrote:

"Berger, Daniel" <Daniel.Berger@qwest.com> 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 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)

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:

#<WIN32OLE:0x6e39ee0>

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:

Microsoft Learn: Build skills that open doors in your career

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)

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:
>
> #<WIN32OLE:0x6e39ee0>
>
> 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:
>>>
>>> Microsoft Learn: Build skills that open doors in your career
>>>
>>> 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)
>>
>>
>>
>>
>
>
>
>
>