Autor Téma: Získání údajů o uživateli z AD  (Přečteno 470 krát)

Offline PetrB0

  • Plnoletý
  • ***
  • Příspěvků: 134
  • Karma: 1
    • Verze Delphi: Delphi XE2, Delphi 10.2 Tokyo, Delphi 10.41
Získání údajů o uživateli z AD
« kdy: 03-11-2022, 00:59:34 »
Ahoj,
snažím se získat údaje o uživateli z Active Directory.
Hledal jsem různě po internetu a našel kódy, které využívají knihovnu ActiveDS_Tlb (tu jsem si do Delphi XE2 importoval).

Zkouším následující kód
Kód: Delphi [Vybrat]
  1. Procedure Test(Const VLDAPString : String;VKam : TStrings);
  2. var
  3.    Usr  : IAdsUser;
  4.    obj  : IAds;
  5.    s    : WideString;
  6.    cls  : IADsClass;
  7. //   cont : IADsContainer;
  8.    i    : integer;
  9.    Radek : Integer;
  10. begin
  11.  Radek:=1;
  12.  Try
  13.    VKam.Add('Testuji LDAP='+VLDAPString);
  14.    ADsGetObject(VLDAPString, IADsUser, Usr);
  15. Radek:=2;
  16.    if assigned(Usr) Then
  17.     AdsGetObject(Usr.AdsPath, IADs, obj )
  18.                            Else
  19.     Begin
  20.      VKam.Add('Not assigned User');
  21.      Exit;
  22.     End;
  23. Radek:=3;
  24.    s := obj.Get_Schema;
  25. Radek:=4;
  26.    AdsGetObject(s, IADsClass, cls );
  27. Radek:=5;
  28.    if VarIsArray(cls.MandatoryProperties) then
  29.     begin
  30. Radek:=6;
  31.      for i := VarArrayLowBound(cls.MandatoryProperties,1) to VarArrayHighBound(cls.MandatoryProperties,1) do
  32.       begin
  33. Radek:=7;
  34.        s := cls.MandatoryProperties[i];
  35. Radek:=8;
  36.        vKam.Add(s);
  37.        //lbMandatory is a listbox showing the mandatory properties
  38.       end;
  39.     end;
  40. Radek:=9;
  41.    if VarIsArray(cls.OptionalProperties) then
  42.     begin
  43. Radek:=10;
  44.      for i := VarArrayLowBound(cls.OptionalProperties,1) to VarArrayHighBound(cls.OptionalProperties,1) do
  45.       begin
  46. Radek:=11;
  47.        s := cls.OptionalProperties[i];
  48. Radek:=12;
  49.       vKam.Add(s);
  50.        //lbOptional is a listbox showing the optional properties
  51.       end;
  52.      end;
  53. Radek:=13;
  54.  Except
  55.   On E:Exception Do
  56.    VKam.Add(Format('Radek %d chyba "%s"',[Radek,E.Message]));
  57.  End;
  58. end;
  59.  
  60.  
Zkouším různé LDAP stringy a pokaždé mi vrátí, že USR je Nil.
Můžete mi poradit, jaký dotaz mám poslat, když vím že existuje uživatel TTest\Karel a chci znát jeho parametry?
Je to "LDAP://dc=TTest,cn=Karel" ?  Tohle mi totiž nefunguje.

Díky

Pb

Offline Jan Fiala

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 4
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Získání údajů o uživateli z AD
« Odpověď #1 kdy: 03-11-2022, 08:13:21 »
Zkus se ptát na: 'LDAP://cn=Karel,TTest'
Tady jsou nějaké příklady dotazů:
https://ldapwiki.com/wiki/LDAP%20Query%20Examples

Offline PetrB0

  • Plnoletý
  • ***
  • Příspěvků: 134
  • Karma: 1
    • Verze Delphi: Delphi XE2, Delphi 10.2 Tokyo, Delphi 10.41
Re:Získání údajů o uživateli z AD
« Odpověď #2 kdy: 03-11-2022, 15:11:24 »
Díky, kouknu na to.

Offline PetrB0

  • Plnoletý
  • ***
  • Příspěvků: 134
  • Karma: 1
    • Verze Delphi: Delphi XE2, Delphi 10.2 Tokyo, Delphi 10.41
Re:Získání údajů o uživateli z AD
« Odpověď #3 kdy: 04-11-2022, 00:59:38 »
Tak to nepomohlo. Vyzkoušel jsem poslat 'LDAP://cn=Karel,TTest' a vrátil se mi opět prázdný objekt.

Upravil jsem volání na
Kód: Delphi [Vybrat]
  1.   i:=ADsGetObject(VLDAPString, IADsUser, Usr);
  2.  
a nechávám si vypisovat obsah i v hexa podobě.
Dostávám 0x80072032, což se má patrně zamaskovat přes 0xFF a výsledný kód je 0x32. Tomu by měl odpovídat chybový kód LDAP_INSUFFICIENT_ACCESS. Takže patrně nemám práva na získání těchto informací.
Aplikace bude běžet jako služba, která má vlastní AD "ClientID" a "Secret" pro které si umím vygenerovat přístupový Token. Ovšem neumím jej připojit k tomu volání LDAP. Jde to nějak? Nebo uvažuji špatně?

Díky

Pb

Dodatek: Tak chyba 0x80072032 skutečně existuje (https://www.computerperformance.co.uk/error-codes/80072032/) a je to "Invalid dn syntax".
Zkusil jsem doplnit dotaz na 'LDAP://cn=Karel,dn=TTest'  a vrátil se mi kód chyby 0x80072020 (An operations error occured), což by tentokrát skutečně vedlo na špatné oprávnění (https://www.computerperformance.co.uk/error-codes/80072020/). Takže se patrně opět vracím k dotazu ohledně autorizace přes token.
« Poslední změna: 04-11-2022, 01:14:21 od PetrB0 »

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1435
  • Karma: 52
    • Verze Delphi: 10.3
Re:Získání údajů o uživateli z AD
« Odpověď #4 kdy: 04-11-2022, 09:16:28 »
Ahoj, když jsem kdysi zápasil s LDAP (fuj...), zkoušel jsem to nejprve přes nějaký LDAP browser a teprve následně jsem stejné dotazy posílal ze své aplikace.

Offline zdenek

  • Plnoletý
  • ***
  • Příspěvků: 141
  • Karma: 8
Re:Získání údajů o uživateli z AD
« Odpověď #5 kdy: 04-11-2022, 17:01:11 »
My to používáme tak, že si nejprve přes ADO najdeme uživatele:

Kód: Delphi [Vybrat]
  1.  TestUSR.SQL.Text:='select AdsPath from ''LDAP://DC=contoso,DC=local'' '+
  2.                                'where objectClass=''user'' and sAMAccountName='''+username+'''';
  3.  TestUSR.Open;
  4.  Objname:=TestUSR.Fields[0].AsWideString;
  5.  TestUSR.Close;
  6.  
  7.  if Objname='' then begin
  8.   ShowMessage('Nenalezeno v AD.');
  9.   exit;
  10.  end;
  11.  
  12.  ADsGetObject(PWIDECHAR(ObjName),IAdsUser,User);
  13.  

ADO Provider je ADSDSOObject

Offline PetrB0

  • Plnoletý
  • ***
  • Příspěvků: 134
  • Karma: 1
    • Verze Delphi: Delphi XE2, Delphi 10.2 Tokyo, Delphi 10.41
Re:Získání údajů o uživateli z AD
« Odpověď #6 kdy: 05-11-2022, 14:35:08 »
Ahoj,
díky za tipy. Mám to tak, že dostanu jméno uživatele, ověřím zda existuje na AD a zároveň si stáhnu nějaké jeho parametry.
Aplikace má přidělené vlastní přístupové jméno(PGMUser) a heslo(PGMPassword) do AD, což dovedu "nahlásit" na AD a stáhnout si certifikát (nevím, zda to potřebuji nebo ne ale nějak to nedokážu spojit s dotazy na LDAP). Když provedu dotaz do LDAP
Kód: Delphi [Vybrat]
  1. VLDAPString:='LDAP://cn=Karel,dn=TTest';
  2. i:=ADsGetObject(VLDAPString, IADsUser, Usr);
  3.  
Tak se mi vrátí chyba 0x80072020, přitom vím že existuje uživatel TTest\Karel (vidím ho jako uživatele na počítači, kde to testuji).
Je nějaká možnost spustit ten "ADsGetObject" stylem "Run as PGMUser"?

Nebo to řešit přes ADO a tam se hlásit přes nějaké TADOConnection kam dám i PGMUser a PGMPassword?

Pb

Offline PetrB0

  • Plnoletý
  • ***
  • Příspěvků: 134
  • Karma: 1
    • Verze Delphi: Delphi XE2, Delphi 10.2 Tokyo, Delphi 10.41
Re:Získání údajů o uživateli z AD
« Odpověď #7 kdy: 05-11-2022, 15:31:43 »
zkouším se připojit přes ado (podle http://agnisoft.com/white_papers/active_directory.asp), což po mě chce uživatelské jméno a heslo, které patrně nemám. Končí to na Invalid Password. Já mám jenom ten přístup na AD (jméno ve stylu XXX-XXX-XXX-XXX-XXX a nějaké generované heslo).
Ale je klidně možné, že mám přístup, ale ten neumožňuje dotazování na LDAP. To ještě raději ověřím.

Offline zdenek

  • Plnoletý
  • ***
  • Příspěvků: 141
  • Karma: 8
Re:Získání údajů o uživateli z AD
« Odpověď #8 kdy: 07-11-2022, 13:47:10 »
Mně běží celý proces pod domain adminem, takže v ADOCOnnection nemám žádné údaje. Vezme se z procesu.

Offline PetrB0

  • Plnoletý
  • ***
  • Příspěvků: 134
  • Karma: 1
    • Verze Delphi: Delphi XE2, Delphi 10.2 Tokyo, Delphi 10.41
Re:Získání údajů o uživateli z AD
« Odpověď #9 kdy: 09-11-2022, 00:19:27 »
Ahoj, děkuji všem za typy.
Konečně jsem se pohnul dál. Získal jsem správné uživatelské jméno i heslo, ale stále mi to při ADO házelo chybu „A referral was returned from the server“.
Měl jsem špatně postavený dotaz. Nastavil jsem "LDAP://cn=Karel,dc=TTest,dc=cz" a konečně mi to vrátllo výsledek.

Pb