ldapsend, получаем sid в hex формате

функция для тех, кто работает с LDAP (ActiveDirectory)

Все знают, что sid LDAP возвращает в формате bin, сконвертируем в hex строку. Функция делает запрос к серверу и получает objectSid пользователя по sAMAccountName, затем конвертирует его в строку hex с разделителями запятыми. Результатом работы функции будет строка: 01,05,00,00,00,00,00,05,15,00,00,00,8a,1c,a9,8e,20,29,32,58,4f,d1,a7,56,50,04,00,00

фильтр запроса (&(objectClass=user)(sAMAccountName=’+user_name+’)(!(userAccountControl:1.2.840.113556.1.4.803:=2))) исключает заблокированные учетные записи.

не забудьте подключить модуль ldapsend из библиотеки Synapse http://synapse.ararat.cz/doku.php/

function get_bin_sid_by_name(user_name,server,user,password,namingContexts: string): string;
var
  ldap: TLDAPsend;
  attr: TStringList;
  s,str:string;
  l:PAnsiChar;
  l_l:integer;
begin
  ldap:= TLDAPsend.Create;
  attr := TStringList.Create;
  attr.Add('cn');
  attr.Add('sAMAccountName');
  attr.Add('objectSid');
  result:='';

  try
    ldap.TargetHost := server;
    ldap.TargetPort := '389';
    ldap.UserName := user+'@'+copy(namingContexts,4,pos(',', namingContexts)-4);
    ldap.Password := password;
    ldap.SearchScope:=SS_WholeSubtree;
    ldap.SearchSizeLimit:=0;
    ldap.SearchTimeLimit:=0;


    if ldap.Login then
     begin
       if ldap.Bind then
        begin
          if ldap.Search('CN=users,'+namingContexts, False, '(&(objectClass=user)(sAMAccountName='+user_name+')(!(userAccountControl:1.2.840.113556.1.4.803:=2)))', attr) then
             begin
               s:=ldap.SearchResult.Items[0].Attributes.Get('objectSid');
               GetMem(l,length(s));
               BinToHex((@s[1]),l,length(s));
               result:=copy(l,1,length(s)*2);
               str:='';
               for l_l:=0 to length(s)*2 do
                 begin
                   if ((l_l mod 2 = 0) and (l_l<>0) and (l_l<>length(s)*2)) then
                     begin
                      str:=str+result[l_l]+',';
                     end
                   else
                     begin
                       str:=str+result[l_l];
                     end;
                 end;
               result:=trim(str);
             end;
        end;
     end;
  finally
     ldap.Free;
     attr.Free;
  end;
end;

user_name — sAMAccountName пользователя, чей sid хотим получить
server — адрес сервера LDAP
user — логин для авторизации
password — пароль пользователя (достаточно прав обычного пользователя домена для чтения атрибутов)
namingContexts — корень нашего домена, например dc=server,dc=loc

Поделиться
Отправить
 622   2019   ActiveDirectory   free pascal   lazarus   ldapsend