Вопрос о том, как получить дату и время последнего запуска системы в Windows 2008/2003 через Delphi, является актуальным для разработчиков, работающих с этой операционной системой. В командной строке Windows можно использовать команду net statistics, но существует более удобный способ получения этой информации непосредственно из программы на Delphi.
Подходы к решению задачи
Существуют различные способы получения даты и времени последнего запуска системы. Одним из них является использование функции GetTickCount, которая возвращает количество миллисекунд, прошедших с момента последнего запуска системы. Однако, этот метод имеет ограничение, так как GetTickCount возвращает 32-битное значение, что приводит к переполнению примерно через 49.7 дней работы системы.
В Windows Vista и выше можно использовать функцию GetTickCount64, которая решает проблему переполнения. Однако, для старых систем, таких как Windows 2003, этот метод не подходит.
Другой способ — использование счетчика "System Up Time" в реестре, который также может быть использован, но требует более сложных манипуляций с данными реестра.
Альтернативный ответ с использованием WMI
Одним из проверенных решений является использование свойства LastBootUpTime класса Win32_OperatingSystem из WMI (Windows Management Instrumentation). Этот класс предоставляет информацию о системе, включая дату и время последнего запуска.
Пример кода на Delphi
Ниже представлен пример кода, который демонстрирует, как можно получить дату и время последнего запуска системы через WMI в Delphi:
program LastBootTime;
{$APPTYPE CONSOLE}
uses
SysUtils,
ActiveX,
Variants,
ComObj;
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;
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_OperatingSystem', 'WQL', 0);
oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
if oEnum.Next(1, FWbemObject, iValue) = 0 then
begin
Writeln(Format('Last BootUp Time: %s', [FormatDateTime('dd-mm-yyyy hh:nn:ss', UtcToDateTime(FWbemObject.LastBootUpTime))]));
end;
end;
begin
try
CoInitialize(nil);
try
GetWin32_OperatingSystemInfo;
finally
CoUninitialize;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
ReadLn;
end.
Этот код использует WMI для получения информации о последнем запуске системы. Он преобразует значение LastBootUpTime, которое возвращается в формате UTC, в локальное время с помощью функции UtcToDateTime.
Заключение
Для получения даты и времени последнего запуска системы в Windows 2008/2003 с помощью Delphi, можно использовать различные методы, включая функцию GetTickCount64 для систем, поддерживающих её, или же воспользоваться WMI для получения точной информации через свойство LastBootUpTime класса Win32_OperatingSystem. Выбор метода зависит от конкретных требований и условий использования.
Вопрос связан с получением даты и времени последнего запуска системы Windows 2008/2003 через Delphi, с обзором различных методов и примером использования WMI для этой задачи.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.