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