Windows Last Boot Date & Time en utilisant Delphi

Comment obtenir la date et l’heure du dernier démarrage / redémarrage / redémarrage sur la machine Windows 2008/2003?

Je sais à partir de l’invite de commande, nous pouvons utiliser “statistiques net”, mais comment le faire via Delphi?

Merci.

Vous pouvez utiliser la propriété LastBootUpTime de la Win32_OperatingSystem WMI Win32_OperatingSystem , qui renvoie la Date and time the operating system was last restarted (Remarque: la valeur renvoyée de cette propriété est au format UTC).

Vérifiez cet exemple d’application

 {$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. 

La fonction GetTickCount (voir MSDN ) renvoie le nombre de millisecondes écastings depuis le démarrage du système. Divisez-la donc par 1000 pour obtenir des secondes, avec 60 000 pour obtenir des minutes, etc.

Le sujet que j’ai lié contient également ce bit:

Pour obtenir le temps écoulé depuis le démarrage de l’ordinateur, récupérez le compteur System Up Time dans les données de performance de la clé de registre HKEY_PERFORMANCE_DATA. La valeur renvoyée est une valeur de 8 octets. Pour plus d’informations, voir Compteurs de performances.

Voici une application complète en ligne de commande qui fait ce dont vous parlez. J’ai modifié cela pour éviter les problèmes de débordement GetTickCount sans compter sur les appels de fonctions externes.

Exemple de sortie:

 Windows was last rebooted at: 06/29/2011 9:22:47 AM 

S’amuser!

 program lastboottime; {$APPTYPE CONSOLE} uses SysUtils, Windows; function UptimeInDays: double; const c_SecondsInADay = 86400; var cnt, freq: Int64; begin QueryPerformanceCounter(cnt); QueryPerformanceFrequency(freq); Result := (cnt / freq) / c_SecondsInADay; end; function LastBootTime: TDateTime; begin Result := Now() - UptimeInDays; end; begin try WriteLn('Windows was last rebooted at: ' + DateTimeToStr(LastBootTime)); ReadLn; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. 

Voici un peu de code qui utilise GetTickCount64 si disponible et revient à GetTickCount s’il n’est pas disponible pour calculer la date et l’heure du démarrage du système. Ce n’est pas une solution parfaite car GetTickCount64 est uniquement pris en charge sous Vista +: si vous êtes sur d’anciens Windows, le compteur revient à 0 tous les 49 jours.

 program Project29; {$APPTYPE CONSOLE} uses SysUtils, Windows; type TGetTickCount64 = function : Int64; stdcall; var H_K32: HMODULE; Tick64Proc: TGetTickCount64; function BootTime: TDateTime; var UpTime: Int64; Seconds, Minutes, Hours: Int64; begin if H_K32 = 0 then begin H_K32 := LoadLibrary(kernel32); if H_K32 = 0 then RaiseLastOSError else begin Tick64Proc := GetProcAddress(H_K32, 'GetTickCount64'); end; end; if Assigned(Tick64Proc) then UpTime := Tick64Proc else UpTime := GetTickCount; Result := Now - EncodeTime(0, 0, 0, 1) * UpTime; end; begin WriteLn(DateTimeToStr(BootTime)); ReadLn; end.