Решение проблемы декодирования временной метки lastLogonTimeStamp в Delphi 7 с использованием ADO и Active Directory
Вопрос пользователя заключается в необходимости чтения поля lastLogonTimeStamp из Active Directory (AD) с использованием Delphi 7 и компонентов ADO. При попытке обращения к данному полю, которое представлено в виде Variant с типом Dispatch, возникает ошибка при попытке преобразования в другие типы данных, например, в string или TDateTime.
Описание проблемы
Пользователь столкнулся с проблемой при работе с полем lastLogonTimeStamp в Active Directory через Delphi 7 и ADO. Поле представляет собой объект Variant типа Dispatch, что делает его непригодным для прямого преобразования в другие типы данных, такие как string или TDateTime. Несмотря на успешное чтение строковых полей, преобразование временной метки приводит к ошибке.
Variant типа 9 (varDispatch) представляет собой интерфейс COM IDispatch, который используется для доступа к членам LowPart и HighPart структуры FILETIME в формате UTC. Это стандартный способ представления временных меток в Active Directory.
Предложенное решение
Для преобразования временной метки в TDateTime можно использовать следующий код:
function LargeIntegerToDate(value: Variant): TDateTime;
var
ftUTC, ftLocal: TFileTime;
st: TSystemTime;
begin
Result := 0;
if VarIsNull(value) then
Exit;
if not VarIsDispatch(value) then
raise Exception.Create('Unsupported type');
ftUTC.dwHighDateTime := value.HighPart;
ftUTC.dwLowDateTime := value.LowPart;
if (ftUTC.dwLowDateTime = 0) and (ftUTC.dwHighDateTime = 0) then
begin
Result := EncodeDate(1601, 1, 1);
Exit;
end;
try
FileTimeToLocalFileTime(ftUTC, ftLocal);
FileTimeToSystemTime(ftLocal, st);
Result := SystemTimeToDateTime(st);
except
on E: Exception do
// Обработка исключений
end;
end;
...
var
logonfield : Variant;
begin
logonfield := ADOQuery1lastLogonTimestamp.Value;
StringGrid1.Cells[1, i] := DateToStr(LargeIntegerToDate(logonfield));
end;
Комментарии к решению
Перед преобразованием необходимо проверить, что значение не является Null.
Функция LargeIntegerToDate принимает значение Variant и возвращает TDateTime.
В коде используется структура FILETIME и функции для работы с временными метками Windows.
Заключение
Используя предложенный функционал, можно успешно декодировать временную метку lastLogonTimeStamp в объект Pascal (Delphi) и далее использовать ее в своем приложении, например, для отображения даты последнего входа пользователя в систему.
Проблема состоит в необходимости декодирования временной метки `lastLogonTimeStamp` из Active Directory для использования в приложении на Delphi 7 с помощью ADO.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.