Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Решение проблемы декодирования временной метки `lastLogonTimeStamp` в Delphi 7 с использованием ADO и Active Directory

Delphi , Базы данных , ADO

Решение проблемы декодирования временной метки 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. Несмотря на успешное чтение строковых полей, преобразование временной метки приводит к ошибке.

Пример кода из вопроса

ADOQuery1lastLogonTimestamp: TVariantField;
logonfield : Variant;
begin
  logonfield := ADOQuery1lastLogonTimestamp.Value;
  StringGrid1.Cells[1, i] := VarToStr(logonfield);
end;

Подход к решению

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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: ADO ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-03-13 21:07:40/0.0032780170440674/0