Доступ к Active Directory из Delphi
30.03.2016В данной статье будут рассмотрены способы извлечения информации из AD средствами Delphi
Приведенный пример справедлив для ОС MS Windows.
- Для того, чтобы опознать пользователя, будем использовать системную библиотеку 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 - Авторизация пользователя в домене
— в этой статье —