Доступ к Active Directory из Delphi

30.03.2016

В данной статье будут рассмотрены способы извлечения информации из AD средствами Delphi

Приведенный пример справедлив для ОС MS Windows.

  1. Для того, чтобы опознать пользователя, будем использовать системную библиотеку secur32.dll  входящую в Windows.
    Именно она позволяет извлечь из переменных активного в системе пользователя информацию о принадлежности к домену.
    Этих данных недостаточно для выполнения сквозной авторизации пользователя в домене, поскольку в них нет пароля пользователя.
    Авторизация юзера в домене будет рассмотрена в другом примере.
    Итак..Секция uses должна содержать в основном наборе следующие компоненты:
    uses
    SysUtils, Variants, Classes, ExtCtrls,ShellApi….Описываем процедуру извлечеиия информации о пользователе в секции implementation

     
    procedure GetUserNameEx(NameFormat: DWORD;
    lpNameBuffer: LPSTR; nSize: PULONG); stdcall;
    external 'secur32.dll' Name 'GetUserNameExA';
    function LoggedOnUserNameEx(fFormat: DWORD): string;
     var
     UserName: array[0..250] of char;
     Size: DWORD;
     begin
      Size := 250;
      GetUserNameEx(fFormat, @UserName, @Size);
      Result := UserName;
      //showmessage(Result);
     end;
    {$R *.dfm}
    

    Вызов процедуры:

    // определение пользователя
           fulstr:= LoggedOnUserNameEx(1);
    

    В переменную будет помещена вся доступная информация о текущем пользователе (в моем случае структура такова) :
    полная строка информации о пользователе

       i:=pos('users,OU=',fulstr)+9;
       Delete(fulstr,1,i-1);
       j:=pos(',OU',fulstr);
       Delete(fulstr,j,Length(fulstr));
    

    Выше приведенными операциями, я отсекаю ненужную информацию из полученной строки слева и справа, получая наименование предприятия.
    Результатом выполнения будет запись:
    название предприятия

       fulname := LoggedOnUserNameEx(3);
    

    Приведенная выше строка возвращает ФИО пользователя из набора получаемого функцией LoggedOnUserNameEx
    ФИО
    Все пользователи домена разнесены по контейнерам предприятий и у каждого в логине установлен префикс предприятия, отделенный от ФИО символом нижнего подчеркивания. Эту информацию извлекаю используя данные возвращаемые LoggedOnUserNameEx(8);. Функция вернет значение =
    доменная учетка

       login := LoggedOnUserNameEx(8);
       j:=pos('@',login);
       Delete(login,j,Length(login));
       pref:=login;
       j:=pos('_',login);
       Delete(pref,j,Length(pref));
    

    Здесь получили значение принятое за префикс (обозначение предприятия):
    код предприятия
    Далее выполняем….

       domen := LoggedOnUserNameEx(8);
       i:=pos('@',domen);
       Delete(domen,1,i);
       form1.Caption:='   Пользователь : '+fulname+ '         Организация : '+fulstr;
    

    В Caption формы будут внесены необходимые данные, а так же будет получено полное имя домена для текущего пользователя:
    домен
    По сути, — это обычный парсинг строки…
    Для получения информации о структуре домена я использовал Softerra LDAP Browser

  2. Авторизация пользователя в домене
    — в этой статье —

Оставить комментарий