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

Аутентификация через LDAP с вводом доменного имени и ID в формате mydomain.com/userid в Delphi

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

Приветствую всех читателей! В этой статье мы рассмотрим вопрос аутентификации через LDAP с вводом доменного имени и ID в формате mydomain.com\userid в Delphi.

Для начала давайте разберемся, что такое LDAP и Active Directory. LDAP (Lightweight Directory Access Protocol) - это протокол доступа к каталогам, который используется для поиска и извлечения информации из каталогов. Active Directory (AD) - это служба каталогов, разработанная корпорацией Microsoft, которая использует LDAP для доступа к каталогам.

Теперь давайте рассмотрим код, который был предоставлен в вопросе:

uses
  adshlp, ActiveDs_TLB

function Tlogon_form.GetUser(Domain, UserName, pword: string; var ADSIUser: TADSIUserInfo): boolean;
var
  usr   :    IAdsUser;
  usr1  :    IADs;
  flags :    integer;
  grps  :    IAdsMembers;
  grp   :    IAdsGroup;
  varGroup : OleVariant;
  Temp :     LongWord;
  pwd, cn_name, FQDN, AD_path: string;
  HR : boolean;
  fad_domain:string;
  objsysinfo: IADsADSystemInfo;
  domainDN: string;
  List: array [0..10] of String;
  I: integer;
  name_nodes :string;

const
  ADS_SECURE_AUTHENTICATION = $00000001;
begin
  ADSIUser.UID:='';
  ADSIUser.UserName:='';
  ADSIUser.DB_login :='';
  ADSIUser.Disabled:=true;
  ADSIUser.LockedOut:=true;
  ADSIUser.Groups:='';
  Result:=false;
  FQDN :='';
  AD_path := '';
  SBN_SQL.Common_login :='';

  FPassword := pword;
  FUserName := UserName;
  //FDomain := lowercase(Domain); // + '.local';

  if FUserName = '' then exit;

  objsysinfo := CoADSystemInfo.Create;
  domainDN := objsysinfo.GetAnyDCName;
  fad_domain := objsysinfo.DomainDNSName;
  name_nodes := objsysinfo.UserName;

  if domain > '' then
  begin
    fad_domain := domain;
  end
  else
  begin
    domain := fad_domain;
  end;

  fad_domain := fad_domain + '.';

  FQDN := domainDN;
  ad_path := name_nodes;

    try
     if trim(FUserName)<>'' then
     begin
        ADsOpenObject('LDAP://' + AD_path, FUserName, FPassword,ADS_SECURE_AUTHENTICATION, IADsUser, usr);
     end;

     if usr=nil then exit;

     ADSIUser.UID:= UserName;

     ADSIUser.UserName := usr.FullName;
     ADSIUser.DB_login := usr.employeeid;
     //usr:=nil;
     Result:=true;
     exit;
  except
     on e: exception do begin
        Result:=false;
        exit;
     end;
  end;

end;

В этом коде мы видим, что автор пытается получить информацию об пользователе из Active Directory, используя ввод доменного имени и ID в формате mydomain.com\userid. Однако, автор столкнулся с проблемой, что не может найти LDAP вызов, который бы позволил ему аутентифицировать пользователя и получить необходимые данные.

Подтвержденный ответ:

Для решения этой проблемы автор может использовать компонент TADSISearcher, который был разработан для поиска пользователей в Active Directory с помощью LDAP. Компонент можно скачать с сайта adsi.mvps.org.

Автор может использовать компонент следующим образом:

uses
  adshlp, ActiveDs_TLB, TADSISearcher

function Tlogon_form.GetUser(Domain, UserName, pword: string; var ADSIUser: TADSIUserInfo): boolean;
var
  usr   :    IAdsUser;
  usr1  :    IADs;
  flags :    integer;
  grps  :    IAdsMembers;
  grp   :    IAdsGroup;
  varGroup : OleVariant;
  Temp :     LongWord;
  pwd, cn_name, FQDN, AD_path: string;
  HR : boolean;
  fad_domain:string;
  objsysinfo: IADsADSystemInfo;
  domainDN: string;
  List: array [0..10] of String;
  I: integer;
  name_nodes :string;
  searcher: TADSISearcher;

const
  ADS_SECURE_AUTHENTICATION = $00000001;
begin
  ADSIUser.UID:='';
  ADSIUser.UserName:='';
  ADSIUser.DB_login :='';
  ADSIUser.Disabled:=true;
  ADSIUser.LockedOut:=true;
  ADSIUser.Groups:='';
  Result:=false;
  FQDN :='';
  AD_path := '';
  SBN_SQL.Common_login :='';

  FPassword := pword;
  FUserName := UserName;
  //FDomain := lowercase(Domain); // + '.local';

  if FUserName = '' then exit;

  objsysinfo := CoADSystemInfo.Create;
  domainDN := objsysinfo.GetAnyDCName;
  fad_domain := objsysinfo.DomainDNSName;
  name_nodes := objsysinfo.UserName;

  if domain > '' then
  begin
    fad_domain := domain;
  end
  else
  begin
    domain := fad_domain;
  end;

  fad_domain := fad_domain + '.';

  FQDN := domainDN;
  ad_path := name_nodes;

  searcher := TADSISearcher.Create(nil);
  try
    searcher.SearchRoot := 'LDAP://' + AD_path;
    searcher.SearchFilter := '(&(objectClass=user)(sAMAccountName=' + FUserName + '))';
    searcher.SearchAttributes := 'cn, samaccountname, employeeid';
    searcher.SearchScope := adsSearchScopeSubtree;
    searcher.SearchTimeLimit := 10000;
    searcher.SearchSizeLimit := 1000;
    searcher.SearchSubtree := true;
    searcher.Execute;
    if searcher.Success then
    begin
      ADSIUser.UID:= FUserName;
      ADSIUser.UserName := searcher.ResultSet.Fields['cn'][0];
      ADSIUser.DB_login := searcher.ResultSet.Fields['samaccountname'][0];
      Result:=true;
    end;
  finally
    searcher.Free;
  end;

end;

В этом коде мы создаем экземпляр компонента TADSISearcher и настраиваем его для поиска пользователя с заданным ID в Active Directory. Мы устанавливаем корень поиска, фильтр поиска, атрибуты поиска, Scope поиска, TimeLimit поиска, SizeLimit поиска и Subtree поиска. Затем мы вызываем метод Execute для выполнения поиска. Если поиск проходит успешно, мы получаем необходимые данные пользователя и возвращаем их в виде TADSIUserInfo.

Альтернативный ответ:

Автор также может использовать функцию ADsOpenObject для аутентификации пользователя и получения необходимых данных. Для этого автор может передать доменное имя и ID пользователя в виде строки в формате mydomain.com\userid в качестве первого параметра функции ADsOpenObject. Например:

```pascal ADsOpenObject('LDAP://mydomain.com/

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

Аутентификация через LDAP с вводом доменного имени и ID пользователя в формате mydomain.com\\userid в 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:18:30/0.0032939910888672/0