Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi AD users of group (https://www.delphipraxis.net/137174-ad-users-group.html)

cherry 15. Jul 2009 16:17


AD users of group
 
Hallo zusammen...

Wenn ich etwas hasse, dann ist es aus Active Directory zu lesen!
Ich hab schon ein paar sachen damit gemacht, aber wirklich zufrieden war ich nie mit den Schnittstellen. -> Ich habe keine "einfache" Schnittstelle gefunden mit
der ich alles machen kann was halt so möglich ist... (natürlich gehts, denke ich, mit jeder. aber ich kappiers nicht)

Also, mein aktuellstes Problem: Ich möchte eine Liste aller Benutzer von einer bestimmten Gruppe. ACHTUNG: Ich will nicht die Distinguished Names (die krieg ich), sondern die
sAMAccountName's!

PS: Nur so nebenbei, bei einem Programm z.B. greiffe ich über verschiedene Schnittstellen aufs AD zu, ist das unschön?
ich vermische z.B. IDSI, ADO und OLE DB ... :stupid:

p80286 15. Jul 2009 17:48

Re: AD users of group
 
Hallo Cherry,

hast Du Dich mal bei Luckie umgeschaut?

Gruß
K-H

cherry 15. Jul 2009 19:16

Re: AD users of group
 
Hab leider nichts gefunden dort.

Luckie 15. Jul 2009 20:02

Re: AD users of group
 
Und findest du hier was: http://www.michael-puff.de/Developer/Delphi/Units/

cherry 16. Jul 2009 08:02

Re: AD users of group
 
Zitat:

Zitat von Luckie

Du, ne. Hab auch da nichts gefunden. Hab mir alle Dateien heruntergeladen und die Inhalte nach Wörtern wie LDAP, AD, user durchsucht....
Hab nichts gefunden was meinem Problem ähnlich wäre!

Hat denn das noch niemand gemacht?

Luckie 16. Jul 2009 09:58

Re: AD users of group
 
Zitat:

Zitat von cherry
Zitat:

Zitat von Luckie

Du, ne. Hab auch da nichts gefunden. Hab mir alle Dateien heruntergeladen und die Inhalte nach Wörtern wie LDAP, AD, user durchsucht....

MpNTUser.pas war gemeint. Man muss es ja nicht über LDAP machen. Allerdinsg musst du die Funktionen in der Unit noch etwas überarbeiten, da die Unit bisher noch nicht für eine Benutzerverwaltung auf Domaincontrollern ausgelegt ist.

cherry 16. Jul 2009 11:39

Re: AD users of group
 
Zitat:

Zitat von Luckie
Man muss es ja nicht über LDAP machen.

Wie siehst du denn das: Ist es nicht "unschön" mehrere Techniken zu verwenden? Ich benutze ja schon LDAP und das über ADO und IDSI...
jetzt kommt noch netapi32 ... kann das gut kommen?

gehts denn nicht mit LDAP?

Zitat:

Zitat von Luckie
MpNTUser.pas war gemeint.

meinst du da konkret "EnumMembersInGroup" ?

Zitat:

Zitat von Luckie
Allerdinsg musst du die Funktionen in der Unit noch etwas überarbeiten, da die Unit bisher noch nicht für eine Benutzerverwaltung auf Domaincontrollern ausgelegt ist.

würdest du das auch so machen, oder würdest du das über LDAP machen?

Luckie 16. Jul 2009 11:51

Re: AD users of group
 
Mit LDAP habe ich nie richtig gearbeitet nur mal in der Schule kurz angeguckt. Aber ich konnte mich nicht richtig damit anfreunden. Die Win-APi ist mir da irgenwie lieber, deswegen würde ich es generell nur mit der Win-API machen. Aber das ist Ansichtssache.

cherry 16. Jul 2009 11:56

Re: AD users of group
 
<edit> ganzer Eintrag editiert :lol:

Zitat:

Zitat von Luckie
Mit LDAP habe ich nie richtig gearbeitet nur mal in der Schule kurz angeguckt. Aber ich konnte mich nicht richtig damit anfreunden. Die Win-APi ist mir da irgenwie lieber, deswegen würde ich es generell nur mit der Win-API machen. Aber das ist Ansichtssache.

Naja, LDAP is ja im Prinzip extra für solche Sachen?!

Also, ich hab die Funktion mal getestet und sie Funktioniert.

Delphi-Quellcode:
function CBF(Member: string; cntMembers: Integer; Data: Pointer): Boolean;
begin
  ShowMessage(Member+#13+IntToStr(cntMembers));
end;

procedure TForm1.EButton1Click(Sender: TObject);
begin
  EnumMembersInGroup('DC01','Administratoren', CallBackFunc, data);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  CallBackFunc := CBF;
end;
Aber jetzt will ich ja die Gruppenmitglieder einer Bestimmten Gruppe im AD und nicht vom lokalen PC / Server. Wie mach ich das jetzt?
beziet sich auch auf:
Zitat:

Zitat von Luckie
Allerdinsg musst du die Funktionen in der Unit noch etwas überarbeiten, da die Unit bisher noch nicht für eine Benutzerverwaltung auf Domaincontrollern ausgelegt ist.

Nun, kann mir da jemand Helfen?

cherry 17. Jul 2009 14:45

Re: AD users of group
 
Hallo Luckie.

Ich bin jetzt so weit. Hab deine Funktion "EnumMembersInGroup" abgeändert. Jetzt macht sie genau dass, was ich will.

Delphi-Quellcode:
function EnumMembersInGlobalGroup(const Server: WideString; Group: WideString; Callback: TEnumMembers; Data: Pointer): DWORD; overload;
var
  Member           : Pointer;
  pWork            : Pointer;
  EntriesRead      : DWORD;
  EntriesTotal     : DWORD;
  NetError         : NET_API_STATUS;
  Loop             : Integer;
begin
  Member := nil;
  pWork := nil;
  try
    NetError := NetGroupGetUsers(PWideChar(Server), PWideChar(Group), 0, Member, MAX_PREFERRED_LENGTH,
      EntriesRead, EntriesTotal, nil);
    if (NetError = NERR_SUCCESS) and (EntriesRead > 0) then
    begin
      pWork := Member;
      if Assigned(Callback) then
      begin
        for Loop := 0 to EntriesRead - 1 do
        begin
          if not Callback(PLocalGroupMembersInfo3(Member)^.lgrmi3_domainandname, EntriesRead, Data) then
            break;
          Inc(Integer(Member), sizeof(Pointer));
        end;
      end;
    end;
  finally
    NetApiBufferFree(pWork);
  end;
  Result := NetError;
end;
@Luckie: Ich denke ich werde noch einige weitere Funktionen in der Art implementieren, soll ich dir, wenn ich "fertig" bin, die Unit zukommen lassen?

Danke an alle...

Luckie 17. Jul 2009 21:01

Re: AD users of group
 
also wie gesagt, meine Kapselung in der Unit ist nur für lokale Computer und nocht für Domain Server. Wenn du jetzt eine Kapselung auch für Domain Server machst, dann kannst du mir die Unit gerne zukommen lassen. Dann werde ich sie unter deinem namen auf meiner Homepage veröffentlichen.

cherry 21. Jul 2009 13:49

Re: AD users of group
 
Zitat:

Zitat von Luckie
Mit LDAP habe ich nie richtig gearbeitet nur mal in der Schule kurz angeguckt. Aber ich konnte mich nicht richtig damit anfreunden. Die Win-APi ist mir da irgenwie lieber, deswegen würde ich es generell nur mit der Win-API machen. Aber das ist Ansichtssache.

Naja, ich bin jetzt, wie bereits erwähnt, daran, die API Funktionen zur einfachen Verwendung in Delphi zu kapseln. Nun was mir dabei auffällt, ist dass mit den reinen Win-APi Funktionen gar nicht alles bewältigt werden kann was ich möchte. Ist es nicht so, dass man mit LDAP viel mehr möglichkeiten hat aus dem AD zu lesen usw?!

An alle die schon öfters Programme rund ums AD geschrieben haben: Welche Schnittstellen verwendet ihr und mischt ihr auch die Schnittstellen?
(Mit mischen meine ich: Im selben Programm mal mit API Funktionen was aus dem AD zu lesen, dann mal mit LDAP usw..)

cherry 24. Jul 2009 08:28

Re: AD users of group
 
Na kommt schon, AD Programme gibts von euch doch sicher wie Sand am Meer... :wink:

haraldr 19. Okt 2011 18:05

AW: AD users of group
 
Die Zeit vergeht... die Fragen bleiben die Gleichen:(

Ich werde gerade mit dem Problem konfrontiert, aus einem in Delphi(Pascal) geschriebenem Programm festzustellen, ob ein ADUser einer bestimmten ADGroup angehört. Zunächst einmal vielen Dank an Luckie und cherry für die Beiträge. Im Prinzip war es genau das, was ich suchte.
Habe also in meinem Programm die API Funktion NetGroupGetUser aufgenommen, bekomme aber generell den GroupNotFound Errorcode zurück. Ich benutze folgende Codezeile:
Code:
var
   Servern: string;
   Groupn: string;

...
NetError := NetGroupGetUsers(PWideChar(Servern), PWideChar(Groupn), 0, Member, MAX_PREFERRED_LENGTH,
      EntriesRead, EntriesTotal, nil);
...
Für Servern gebe ich den Namen des entsprechenden PC an, z.B. "DC001.network1.local", für Groupn die gewünschte Gruppe, z.B. "Administratoren".

Kann mir jemand auf die Sprünge helfen?

Beste Grüße
H.

Bummi 19. Okt 2011 18:16

AW: AD users of group
 
@haraldr
passt zwar nicht ganz zu Deiner Anforderung, aber vielleicht kannst Du aus meinem Ansatz der entsprechende Abfrage selbst bauen ..
Delphi-Quellcode:
Procedure GetLDAPGrouplist(const Domain, Username, Password : String; list: TStrings);
var
    rs, conn, com : Variant;
    strADS, s : string;
    ft : TFileTime;
    arrVar: Array of variant;
    i:Integer;
begin

  conn := CreateOleObject('ADODB.Connection');
  com := CreateOleObject('ADODB.Command');
  try
    conn.Provider := 'ADsDSOObject';
    conn.Properties ('User ID') := Username;
    conn.Properties ('Password') := Password;
    conn.Properties ('Encrypt Password') := TRUE;
    conn.Properties ('ADSI Flag') := 3;
    conn.open;
    com.ActiveConnection := conn;
    strADS := '<LDAP://' + Domain + '>;(&(objectClass=user)(sAMAccountName='+USername+'));memberOf;subtree';
    Com.CommandText := strADS;
    Com.Properties['Page Size'] := 100000;
    Com.Properties['Searchscope'] := 2;
    Com.Properties['Cache Results'] := False;
    rs := Com.Execute;
    if Not rs.EOF then
    begin
      try
        arrVar := rs.Fields['memberOf'].Value
      except
        SetLength(arrVar,1);
        arrVar[0] := '';
      end;
    end;
    Rs := NULL;
  finally
    com := NULL;
    conn.Close;
    conn := NULL;
  end;
  for i := 0 to Length(arrVar) - 1 do
  begin
    s := Copy(arrVar[i],Pos('CN=',arrVar[i]) + 3,Length(arrVar[i]));
    s := Copy(s,1,Pos(',',s) - 1);
    list.Add(s);
  end;
end;

haraldr 20. Okt 2011 13:00

AW: AD users of group
 
@Bummi,

vielen Dank.
Dieser Ansatz hat mir sehr geholfen. Die Tests in meinem lokalen Netzwerk (AD mit Windows 2008SBS) funktionieren!

Möglicherweise scheitert der API-Call NetGroupGetUsers() an Authentifizierungsproblemen...
das schließe ich mal daraus, dass ich bei der LDAP/ADO Lösung Nutzer und Kennwort übermitteln muss, um die Informationen zu erhalten.

Beste Grüße
H.

CCRDude 20. Okt 2011 13:07

AW: AD users of group
 
Zitat:

Zitat von haraldr (Beitrag 1131326)
Für Servern gebe ich den Namen des entsprechenden PC an, z.B. "DC001.network1.local", für Groupn die gewünschte Gruppe, z.B. "Administratoren".

Das ist ja nun ein deutscher Gruppenname - hatte die API nicht extra Zweibuchstaben-Aliase für die Lokalisierungsproblematik? Müsstest Du den Net*-Funktionen also nicht hier zum Beispiel BA (für Builtin Admins) oder DA (für Domain Admins) übergeben?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz