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

Ограничение функций приложения на основе местоположения пользователя с помощью DsGetDcName

Delphi , Файловая система , Активные директории

Ограничение функций приложения на основе местоположения пользователя может быть необходимо для различных целей, таких как защита конфиденциальных данных или ограничение доступа к определенным функциям приложения в зависимости от того, где находится пользователь. Один из способов реализовать это в Delphi - использовать функцию DsGetDcName для получения информации о домене, к которому подключен пользователь, и сравнить полученную информацию с заранее заданной константой.

Функция DsGetDcName возвращает структуру DOMAIN_CONTROLLER_INFO, содержащую информацию о домене, к которому подключен пользователь, а также GUID домена. GUID домена - это уникальный идентификатор, который присваивается домену при его создании и не меняется, пока домен существует. Это делает GUID домена идеальным кандидатом для использования в качестве критерия ограничения функций приложения.

Ниже приведен пример кода на Object Pascal (Delphi), который демонстрирует, как использовать функцию DsGetDcName для получения информации о домене пользователя и сравнить полученную информацию с заранее заданной константой:

program LimitAppFunctions;

{$APPTYPE CONSOLE}

uses
  System.SysUtils,
  System.Classes,
  Windows;

type
  EAccessDenied = class(Exception);
  EInvalidOwner = class(Exception);
  EInsufficientBuffer = class(Exception);
  ELibraryNotFound = class(Exception);

  NET_API_STATUS = Integer;

  TDomainControllerInfoA = record
    DomainControllerName: PChar;
    DomainControllerAddress: PChar;
    DomainControllerAddressType: ULONG;
    DomainGuid: TGUID;
    DomainName: PChar;
    DnsForestName: PChar;
    Flags: ULONG;
    DcSiteName: PChar;
    ClientSiteName: PChar;
  end;

  PDomainControllerInfoA = ^TDomainControllerInfoA;

const
  NERR_Success = 0;

procedure NetCheck(ErrCode: NET_API_STATUS);
begin
  if ErrCode <> NERR_Success then
  begin
    case ErrCode of
      ERROR_ACCESS_DENIED:
        raise EAccessDenied.Create('Access is Denied');
      ERROR_INVALID_OWNER:
        raise EInvalidOwner.Create('Cannot assign the owner of this object.');
      ERROR_INSUFFICIENT_BUFFER:
        raise EInsufficientBuffer.Create('Buffer passed was too small');
      else
        raise Exception.Create('Error Code: ' + IntToStr(ErrCode) + #13 +
          SysErrorMessage(ErrCode));
    end;
  end;
end;

function IsInternalDomain: Boolean;
var
  NTNetDsGetDcName: function(ComputerName, DomainName: PChar; DomainGuid: PGUID; SiteName: PChar; Flags: ULONG; var DomainControllerInfo: PDomainControllerInfoA): NET_API_STATUS; stdcall;
  NTNetApiBufferFree: function (lpBuffer: Pointer): NET_API_STATUS; stdcall;
  LibHandle: THandle;
  DomainControllerInfo: PDomainControllerInfoA;
  ErrMode: Word;
const
  NTlib = 'NETAPI32.DLL';
  DS_IS_FLAT_NAME = $00010000;
  DS_RETURN_DNS_NAME = $40000000;
  INTERNAL_DOMAIN_GUID: TGUID = '{????????-????-????-????-????????????}';
begin
  if Win32Platform = VER_PLATFORM_WIN32_NT then
  begin
    ErrMode := SetErrorMode(SEM_NOOPENFILEERRORBOX);
    LibHandle := LoadLibrary(NTlib);
    SetErrorMode(ErrMode);
    if LibHandle = 0 then
      raise ELibraryNotFound.Create('Unable to map library: ' + NTlib);
    try
      @NTNetDsGetDcName := GetProcAddress(Libhandle, 'DsGetDcNameA');
      @NTNetApiBufferFree := GetProcAddress(Libhandle,'NetApiBufferFree');
      try
        NetCheck(NTNetDsGetDcName(nil, nil, nil, nil, DS_IS_FLAT_NAME or DS_RETURN_DNS_NAME, DomainControllerInfo));
        Result := (DomainControllerInfo.DomainName = 'internal.com') and (CompareMem(@DomainControllerInfo.DomainGuid,@INTERNAL_DOMAIN_GUID, SizeOf(TGuid)));
      finally
        NetCheck(NTNetApiBufferFree(DomainControllerInfo));
      end;
    finally
      FreeLibrary(LibHandle);
    end;
  end
  else
    Result := False;
end;

begin
  if IsInternalDomain then
    Writeln('User is in internal domain')
  else
    Writeln('User is not in internal domain');
  Readln;
end.

В этом примере функция IsInternalDomain использует функцию DsGetDcName для получения информации о домене пользователя и сравнивает полученную информацию с заранее заданной константой INTERNAL_DOMAIN_GUID. Если информация совпадает, то функция возвращает True, в противном случае - False.

Пример кода, приведенный выше, является очень простым и не учитывает многие возможные сценарии, такие как ошибки

Создано по материалам из источника по ссылке.

В данном контексте рассматривается ограничение функций приложения на основе местоположения пользователя, для чего используется функция DsGetDcName в Delphi для получения информации о домене пользователя и сравнения ее с заданной константой.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Активные директории ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 15:49:43/0.0032079219818115/0