Click to See Complete Forum and Search --> : to whom it may concern: getting remote time


Lothar Haensler
October 14th, 1999, 03:00 AM
If you ever need to get the time from a remote computer you can use the following code sample:

option Explicit
private Declare Function NetRemoteTOD Lib "Netapi32.dll" ( _
tServer as Any, pBuffer as Long) as Long

private Declare Function NetApiBufferFree Lib "Netapi32.dll" (byval lpBuffer as Long) as Long
private Type TIME_OF_DAY_INFO
tod_elapsedt as Long
tod_msecs as Long
tod_hours as Long
tod_mins as Long
tod_secs as Long
tod_hunds as Long
tod_timezone as Long
tod_tinterval as Long
tod_day as Long
tod_month as Long
tod_year as Long
tod_weekday as Long
End Type
private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination as Any, Source as Any, byval Length as Long)

private Sub Command1_Click()
Dim lRet as Long
Dim tod as TIME_OF_DAY_INFO
Dim lpbuff as Long
Dim tServer() as Byte
tServer = "yourServerNameGoesHere" & vbNullChar
lRet = NetRemoteTOD(tServer(0), lpbuff)
If lRet = 0 then
CopyMemory tod, byval lpbuff, len(tod)
' tod.tod_day, tod.tod_month, tod.tod_year are the fields to look for.
End If
NetApiBufferFree lpbuff
End Sub



this works only under NT!

Lothar Haensler
October 15th, 1999, 02:30 AM
to make this more handy, I rewrote it completely:
place this code in a standard module

option Explicit
private Declare Function NetRemoteTOD Lib "Netapi32.dll" ( _
tServer as Any, pBuffer as Long) as Long

private Type SYSTEMTIME
wYear as Integer
wMonth as Integer
wDayOfWeek as Integer
wDay as Integer
wHour as Integer
wMinute as Integer
wSecond as Integer
wMilliseconds as Integer
End Type
private Type TIME_ZONE_INFORMATION
Bias as Long
StandardName(32) as Integer
StandardDate as SYSTEMTIME
StandardBias as Long
DaylightName(32) as Integer
DaylightDate as SYSTEMTIME
DaylightBias as Long
End Type
private Declare Function GetTimeZoneInformation Lib "kernel32" (lpTimeZoneInformation as TIME_ZONE_INFORMATION) as Long

private Declare Function NetApiBufferFree Lib "Netapi32.dll" (byval lpBuffer as Long) as Long
private Type TIME_OF_DAY_INFO
tod_elapsedt as Long
tod_msecs as Long
tod_hours as Long
tod_mins as Long
tod_secs as Long
tod_hunds as Long
tod_timezone as Long
tod_tinterval as Long
tod_day as Long
tod_month as Long
tod_year as Long
tod_weekday as Long
End Type
private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination as Any, Source as Any, byval Length as Long)


public Function getRemoteTOD(byval strServer as string) as date
Dim result as date
Dim lRet as Long
Dim tod as TIME_OF_DAY_INFO
Dim lpbuff as Long
Dim tServer() as Byte
tServer = strServer & vbNullChar
lRet = NetRemoteTOD(tServer(0), lpbuff)
If lRet = 0 then
CopyMemory tod, byval lpbuff, len(tod)
NetApiBufferFree lpbuff
result = DateSerial(tod.tod_year, tod.tod_month, tod.tod_day) + _
TimeSerial(tod.tod_hours, tod.tod_mins - tod.tod_timezone, tod.tod_secs)
getRemoteTOD = result
else
Err.Raise Number:=vbObjectError + 1001, _
Description:="cannot get remote TOD"
End If
End Function




to use it in your program, call it like this:

private Sub Command1_Click()
Dim d as date
d = getRemoteTOD("your server name goes here")
MsgBox d
End Sub



the function returns a VB Date,
it raises an error, if NetRemoteTOD failed
it takes care of time zone information (although I am not totally sure that I handle it correctly. It worked in my environment, though.)

Chris Eastwood
October 15th, 1999, 02:50 AM
Another great piece of work - would you like this one posted on the site too ? (I've nearly finished the 'sql servers in domain' one for you).


Chris Eastwood

CodeGuru - the website for developers
http://codeguru.developer.com/vb

Lothar Haensler
October 15th, 1999, 02:57 AM
Hi Chris,

sure, you can post it.

Regards,
Lothar

Chris Eastwood
October 15th, 1999, 02:59 PM
Hi Lothar

I've added it at :

http://codeguru.developer.com/vb/articles/1915.shtml


Chris Eastwood

CodeGuru - the website for developers
http://codeguru.developer.com/vb