How do I convert WMI dates to standard dates and times?
Use the SWbemDateTime object to convert these to regular dates and times.
const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; FWbemDateObj : OleVariant; Dt : TDateTime; begin; FWbemDateObj := CreateOleObject('WbemScripting.SWbemDateTime'); FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT InstallDate FROM Win32_OperatingSystem','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; if oEnum.Next(1, FWbemObject, iValue) = 0 then begin FWbemDateObj.Value:=FWbemObject.InstallDate; Dt:=FWbemDateObj.GetVarDate; Writeln(Format('InstallDate %s',[FormatDateTime('dd mmm yyyy',dt)])); Writeln(''); FWbemObject:=Unassigned; end; end;
How do I determine the time currently configured on a computer?
Use the Win32_LocalTime class.
const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_LocalTime','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; if oEnum.Next(1, FWbemObject, iValue) = 0 then begin Writeln(Format('Year : %d',[Integer(FWbemObject.Year)])); Writeln(Format('Month : %d',[Integer(FWbemObject.Month)])); Writeln(Format('Day : %d',[Integer(FWbemObject.Day)])); Writeln(Format('Hour : %d',[Integer(FWbemObject.Hour)])); Writeln(Format('Minute : %d',[Integer(FWbemObject.Minute)])); Writeln(Format('Second : %d',[Integer(FWbemObject.Second)])); Writeln(Format('Day Of Week : %d',[Integer(FWbemObject.DayOfWeek)])); Writeln(Format('Quarter : %d',[Integer(FWbemObject.Quarter)])); Writeln(Format('Week In Month : %d',[Integer(FWbemObject.WeekInMonth )])); Writeln(''); FWbemObject:=Unassigned; end; end;
How do I determine the name of the time zone in which a computer is running?
Use the Win32_TimeZone class and check the value of the Description property.
const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_TimeZone','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; if oEnum.Next(1, FWbemObject, iValue) = 0 then begin Writeln(Format('Description : %s',[String(FWbemObject.Description)])); Writeln(Format('Daylight Name : %s',[String(FWbemObject.DaylightName)])); Writeln(Format('Standard Name : %s',[String(FWbemObject.StandardName)])); Writeln(''); FWbemObject:=Unassigned; end; end;
This post is based in the MSDN entry WMI Tasks: Dates and Times