Время старта и завершения работы системы

Материал из DRKB

Время старта и завершения работы системы[править | править код]

Вот так можно узнать дату/время загрузки или завершения работы системы (т.е. когда компьютер был выключен или перезагружен последний раз):


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Registry;

{$R *.dfm}

type
  SYSTEM_TIME_OF_DAY_INFORMATION = record
    BootTime: LARGE_INTEGER;
    CurrentTime: LARGE_INTEGER;
    TimeZoneBias: LARGE_INTEGER;
    CurrentTimeZoneId: ULONG;
  end;
  PSYSTEM_TIME_OF_DAY_INFORMATION = ^SYSTEM_TIME_OF_DAY_INFORMATION;

  NTSTATUS = DWORD;

const
  SystemTimeOfDayInformation = 3;

function NtQuerySystemInformation(SystemInformationClass: byte;
  SystemInformation: Pointer; SystemInformationLength: ULONG;
  ReturnLength: PULONG): NTSTATUS; stdcall; external 'NTDLL.DLL';


function SysDateToStr(ST: TSystemTime): string;
const
  sDateFmt = 'dddd, d MMMM, yyyy';
begin
  SetLength(Result, 255);
  GetDateFormat(LOCALE_USER_DEFAULT, 0, @ST, sDateFmt, @Result[1], 255);
  SetLength(Result, LStrLen(@Result[1]));
end;

function SysTimeToStr(ST: TSystemTime): string;
const
  sTimeFmt = 'HH:mm:ss';
begin
  SetLength(Result, 15);
  GetTimeFormat(LOCALE_USER_DEFAULT, 0, @st, sTimeFmt, @Result[1], 15);
  SetLength(Result, StrLen(@Result[1]));
end;

function GetFileTimeToSystemTime(ft: TFileTime): string;
var
  st, lt: TSystemTime;
  tz: TTimezoneInformation;
begin
  Result := '';
  if not FileTimeToSystemTime(ft, st) then
    exit;
  GetTimeZoneInformation(tz);
  SystemTimeToTzSpecificLocalTime(@tz, st, lt);
  Result := SysDateToStr(lt) + '  at  ' + SysTimeToStr(lt);
end;

// дата/время последнего выключения (или перезагрузки) системы
function GetLastSystemShutdown: string;
var
  ft: TFileTime;
  reg: TRegistry;
begin
  Result := '';
  reg := TRegistry.Create;
  try
    reg.RootKey := HKEY_LOCAL_MACHINE;
    if (not reg.OpenKeyReadOnly('System\CurrentControlSet\Control\Windows')) then
      exit;
    if (reg.ReadBinaryData('ShutdownTime', ft, sizeof(ft)) = 0) then
      exit
  finally
    reg.Free
  end;
  Result := GetFileTimeToSystemTime(ft);
end;

// дата/время старта системы
function NtGetBootDateTime: string;
var
  sti: SYSTEM_TIME_OF_DAY_INFORMATION;
  status: NTSTATUS;
  ftSystemBoot: FILETIME;
  ST: TSystemTime;
begin
  Result := '';
  status := NtQuerySystemInformation(SystemTimeOfDayInformation, @sti,
    sizeof(SYSTEM_TIME_OF_DAY_INFORMATION), nil);
  if (status <> NO_ERROR) then
    exit;
  ftSystemBoot := PFILETIME(@(sti.BootTime))^;
  if FileTimeToLocalFileTime(ftSystemBoot, ftSystemBoot) then
    if FileTimeToSystemTime(ftSystemBoot, ST) then
      Result := SysDateToStr(ST) + '  at  ' + SysTimeToStr(ST);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Label1.Caption := 'System start: ' + NtGetBootDateTime;
  Label2.Caption := 'Last system shutdown: ' + GetLastSystemShutdown;
end;

end.


PS: работает только в NT и выше.


Author: Krid
Source: Взято из http://forum.sources.ru
ID: 01655