Search code examples
windowsdelphiuptime

Windows Last Boot Date & Time using Delphi


How to get the date & time of the last boot / reboot / restart on Windows 2008/2003 machine?

I know from command prompt we can use "net statistics", but how to do it via Delphi?

Thanks.


Solution

  • You can use the LastBootUpTime property of the Win32_OperatingSystem WMI Class, which return the Date and time the operating system was last restarted (Note : the returned value of this property is in UTC format).

    Check this sample app

    {$APPTYPE CONSOLE}
    
    uses
      SysUtils,
      ActiveX,
      Variants,
      ComObj;
    
    
    //Universal Time (UTC) format of YYYYMMDDHHMMSS.MMMMMM(+-)OOO.
    //20091231000000.000000+000
    function UtcToDateTime(const V : OleVariant): TDateTime;
    var
      Dt : OleVariant;
    begin
      Result:=0;
      if VarIsNull(V) then exit;
      Dt:=CreateOleObject('WbemScripting.SWbemDateTime');
      Dt.Value := V;
      Result:=Dt.GetVarDate;
    end;
    
    procedure  GetWin32_OperatingSystemInfo;
    const
      WbemUser            ='';
      WbemPassword        ='';
      WbemComputer        ='localhost';
      wbemFlagForwardOnly = $00000020;
    var
      FSWbemLocator : OLEVariant;
      FWMIService   : OLEVariant;
      FWbemObjectSet: OLEVariant;
      FWbemObject   : OLEVariant;
      oEnum         : IEnumvariant;
      iValue        : LongWord;
    begin;
      FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
      FWMIService   := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
      FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_OperatingSystem','WQL',wbemFlagForwardOnly);
      oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
      if oEnum.Next(1, FWbemObject, iValue) = 0 then
      begin
        Writeln(Format('Last BootUp Time    %s',[FWbemObject.LastBootUpTime]));// In utc format
        Writeln(Format('Last BootUp Time    %s',[formatDateTime('dd-mm-yyyy hh:nn:ss',UtcToDateTime(FWbemObject.LastBootUpTime))]));// Datetime
      end;
    end;
    
    
    begin
     try
        CoInitialize(nil);
        try
          GetWin32_OperatingSystemInfo;
        finally
          CoUninitialize;
        end;
     except
        on E:Exception do
            Writeln(E.Classname, ':', E.Message);
     end;
     Writeln('Press Enter to exit');
     Readln;
    end.