Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Active Directory Gruppen in Gruppen ermitteln (https://www.delphipraxis.net/114609-active-directory-gruppen-gruppen-ermitteln.html)

cst_07 28. Mai 2008 09:04


Active Directory Gruppen in Gruppen ermitteln
 
Hi,

irgendwie verzweifle :wall: ich gerade dabei, wenn ich alle Gruppenmitgleider (Active Directory) einer Gruppe inklusive Gruppen auslesen möchte. Momentan kann ich nur alle Gruppen eines Benutzers und alle Benutzer einer Gruppe auslesen, aber Gruppen werden leider nicht ausgelsesen. Vielleicht hat das hier schon jemand gemacht.

Als Schnittstelle gehe ich über die Windows API. Dabei habe ich folgende Funktionen schon ausprobiert, jedoch lieferte mir keine die gewünschte Gruppen in Gruppen Abbildung.
- NetUserGetGroups
- NetGroupGetUsers
- NetLocalGroupGetMembers

Beispiel:

Gruppe: A
  • Hans Muster
  • Max Muster
  • Gruppe B

Gruppe: B
  • Maier Müller
  • John Walker

Wie kann ich ermitteln, ob Gruppe B Mitglied von Gruppe A ist?

Vielen Dank schon mal im Voraus für eure Hilfe!!! :thumb:

Christian Seehase 28. Mai 2008 17:19

Re: Active Directory Gruppen in Gruppen ermitteln
 
Moin cst_07,

solltest Du Zugriff auf das Buch "Scripting für Administratoren" von Microsoft Press haben:
Dort gibt es, AFAIK, ein Script, mit dem man genau das machen kann.
Evtl. wirst Du auch im Scripting Center von MS fündig

RWarnecke 28. Mai 2008 18:23

Re: Active Directory Gruppen in Gruppen ermitteln
 
Hast Du versucht, es mal über LDAP zu lösen ?

cst_07 29. Mai 2008 18:02

Re: Active Directory Gruppen in Gruppen ermitteln
 
Vielen Dank für die Antworten.

Ich möchte LDAP nur als zusätzliche Schnittstelle optional anbieten. Die erste Schnittstelle möchte ich mit der Windows API kompltett ermitteln. Das hat soweit auch gut funktioniert, nur fehlt es noch an der "Gruppen in Gruppen" funktionalität und ich finde keine Funktion, welche die Gruppenmitglieder einer Gruppe ermittelt.

H E L P :wiejetzt:

RWarnecke 29. Mai 2008 18:07

Re: Active Directory Gruppen in Gruppen ermitteln
 
Frage mal Luckie, vielleicht kann er Dir weiterhelfen. Er hat ja den XP Usermanager geschrieben.

Luckie 29. Mai 2008 18:52

Re: Active Directory Gruppen in Gruppen ermitteln
 
Also Gruppen in Gruppen habe ich auch noch nicht gehabt.

Remko 29. Mai 2008 18:55

Re: Active Directory Gruppen in Gruppen ermitteln
 
Did you try NetLocalGroupGetMembers with level 2? The LOCALGROUP_MEMBERS_INFO_2 structure should provide you with groups that are member of your group. But I must say that using ADSI is the preferred way for handling this in an AD environment.

cst_07 30. Mai 2008 16:20

Re: Active Directory Gruppen in Gruppen ermitteln
 
Hi,

mit NetLocalGroupGetMembers komme ich leider nicht auf das gewünschte Ergebnis. Es fehlen zudem noch die Zuordnungen von globalen Gruppen in Gruppen. Irgendwie ist die Suche sehr sher mühselig in dem Bereich :roll: .

Ideen sind immernoch willkommen!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! :cheer:

Remko 30. Mai 2008 16:22

Re: Active Directory Gruppen in Gruppen ermitteln
 
So ADSI is the answer here. Is there any reason why you don't want this?

cst_07 2. Jun 2008 15:08

Re: Active Directory Gruppen in Gruppen ermitteln
 
Thank you for your answer!

Do you know the name of the function? Or a link to some more information?

At the moment I have realized all functions with the Windows API. If there will be no other way to do that, so I would like to use ADSI. ;)

Remko 2. Jun 2008 22:52

Re: Active Directory Gruppen in Gruppen ermitteln
 
Sure, I made you a short sample

Delphi-Quellcode:
uses JwaWindows; // Jedi Apilib with New Include model

var
  AdsPath: WideString;
  ADGroup: IADSGroup;
  GroupMember: IADS;
  GroupType: OleVariant;
  hr: HResult;
  Enum: IEnumVariant;
  Fetched: Cardinal;
  ResultItem: OleVariant;
begin
  //  an Adspath always starts with LDAP:// or optionally LDAP://SERVERNAME
  AdsPath := 'LDAP://CN=Domain Admins,CN=Users,DC=rmi,DC=local';
  ADGroup := nil;

  // Bind to the object
  hr := ADsGetObject(PWideChar(AdsPath), IID_IADSGROUP, Pointer(ADGroup));
  Memo1.Lines.Add(Format('hr=%d (%s) ', [hr, SysErrorMessage(GetLastError)]));
  // Check for errors!
  if failed(hr) then
  begin
    // raise exception...
    Exit
  end;

  // Enumerate the members
  Enum := ADGroup.Members._NewEnum as IEnumVariant;
  Enum.Reset;
  Enum.Next(1, ResultItem, Fetched);

  while Fetched = 1 do
  begin
    GroupMember := IDispatch(ResultItem) as IADS;

    // is the member a user?
    if GroupMember.Class_ = 'user' then
    begin
      with (GroupMember as IADSUser) do
      begin
        Memo1.Lines.Add(Format('user: %s', [Get('displayName')]));
      end;
    end
    // is the member a group?
    else if GroupMember.Class_ = 'group' then
    begin
      with (GroupMember as IADSGroup) do
      begin
        // you should really wrap retreiving AD properties in try..except
        Memo1.Lines.Add(Format('user: %s', [Get('displayName')]));
        GroupType := Get('groupType');

        if GroupType = ADS_GROUP_TYPE_GLOBAL_GROUP or
          ADS_GROUP_TYPE_SECURITY_ENABLED then
        begin
         // Do something based on group type
        end;
      end;
    end;

    // Next
    Enum.Next(1, ResultItem, Fetched);

  end;
end;

fatality 11. Mai 2012 08:36

AW: Active Directory Gruppen in Gruppen ermitteln
 
dies ist eigentlich dass was ich suche.
Ich bräuchte es nur ein bisschen anders. Und zwar ( wie ich schon irgendwo ausführlich im Forum geschrieben habe, eigentlich ist dies der optimale Thread, der Admin kann den anderen Beitrag löschen) geht es bei mir darum die Gruppe herauszufinden welcher meine Gruppe zugeordnet ist. Also ich bin in der gruppe "A" und diese ist der Gruppe "B" zugeordnet.Ich kann ohne Probleme herausfinden dass ich zu der Gruppe "A" gehöre, jedoch ist mein Problem dass ich nicht weiß wie ich die gruppe "B" (also eine Art "übergeordnete" Gruppe meiner Gruppe) bekommen kann. Gibt es da auch einen Weg ?

LG Semir

fatality 15. Mai 2012 10:07

AW: Active Directory Gruppen in Gruppen ermitteln
 
keiner eine Ahnung wie ich vorgehen könnte ?

LG Semir

chrisw 15. Mai 2012 14:22

AW: Active Directory Gruppen in Gruppen ermitteln
 
Ich hatte mal so was ähnliches, hab das so gelöst :
Damit bekomme ich alle Gruppen und deren "Untergruppen", die der Nutzer (oder das Objekt) angehört

Delphi-Quellcode:
var ADGroupList : TStringList;
Aufruf mit z.Bsp.: getGroups('LDAP://CN=Username,OU=Second Level,OU=First Level,DC=domain,DC=co,DC=de');
Delphi-Quellcode:
procedure TWebModule1.getGroups(s:String);
var Obj,Grps : Variant;
tempStr : String;
i : Integer;
begin
  try
    Obj := GetObject(s);
  except
  //sicherstellen das Obj nicht leer
  //......
  end;
  try
    Grps := Obj.Get('MemberOf');
    if VarType( Grps ) and varArray <> varArray then
    Grps := VarArrayOf( [ Grps ] );
    for i := VarArrayLowBound( Grps, 1 ) to VarArrayHighBound( Grps, 1) do
    begin
      tempStr := Grps[ i ];
      if ADGroupList.IndexOf( tempStr ) = -1 then
      begin
        ADGroupList.Add(tempStr);
        GetGroups('LDAP://' + tempStr);
      end;
    end;
  except
  //........
  end;
end;
:wink:

fatality 15. Mai 2012 15:25

AW: Active Directory Gruppen in Gruppen ermitteln
 
Hallo Chris,

danke erstmal für die Antwort. Ich hätte noch eine Frage.
Muss ich am Übergabeparameter noch was ändern ('LDAP://CN=Username,OU=Second Level,OU=First Level,DC=domain,DC=co,DC=de'), bzw. die Domain anpassen oder ähnliches ?
Denn wenn ich es so ausführe bekomme ich folgenden fehler " Eine referenzauswertung wurde vom Server zurückgesendet"

(sorry für die blöde frage, hab bis jetzt nur mit ADSI versucht das Problem zu lösen, und erst seit kurzem herausgefunden dass das was ich will nur über LDAP geht, und da bin jetzt ganz neu dabei :) )

LG Semir

chrisw 16. Mai 2012 06:18

AW: Active Directory Gruppen in Gruppen ermitteln
 
Nein, eigentlich solltest du nur deine Parameter eintragen.
(bei mir ist das LDAP://CN=testuser,OU=Users,DC=mar,DC=op für die Dömäne mar.op und den User testuser).
Ich schliesse aber nicht aus, dass du Adminrechte brauchst, um die Funktion auszuführen.

Christian

fatality 16. Mai 2012 07:54

AW: Active Directory Gruppen in Gruppen ermitteln
 
Hi chris,

Also ich bin der User "sussa" und bin in der Domäne "acp", und den String hab ich dann folgendermaßen geändert :
getGroups('LDAP://CN=sussa,OU=Users,DC=acp')

Ich verfüge über Adminrechte ( kann auch die Zuordnung mit externen Programmen auslesen)

Und wie müsste ich den Parameter ändern wenn ich alle Gruppen von der Domäne auslesen möchte ?
Ich muss alle Gruppen von der Domäne auslese, dann die Gruppen der Gruppen, und da müsste ich dann schauen ob der Windows Benutzer in dieser 2. Gruppe ist.

Wäre auch dankbar für einen Link wo ich was von dieser Problematik finden könnte, im Forum bin ich leider nicht fündig geworden

LG Semir

chrisw 16. Mai 2012 09:52

AW: Active Directory Gruppen in Gruppen ermitteln
 
Ich denke es müsste LDAP://CN=sussa,CN=Users,DC=acp heissen. Außerdem sollte die Domäne eigentlich aus mind. 2 DC bestehen (z.Bsp. test.de ist dann DC=test, DC=de) und es müsste eigentlich auch eine OU vorhanden sein.

Auf jeden Fall deutet die Fehlermeldung "Eine Referenzauswertung wurde vom Server zurückgesendet" darauf hin, dass der LDAP-String falsch ist. Sie tritt also schon beim ersten try except auf.

Christian

fatality 14. Jun 2012 15:00

AW: Active Directory Gruppen in Gruppen ermitteln
 
Hi,

also ich hab die Daten richtig eingesetzt und bei mir funzt es auch. Wenn ich nun jedoch in der Produktivumgebung versuche geht es nicht. Der Unterschied ( oder das Problem) ist folgendes :
In der Produktivumgebung bin ich in einer subdomain und versuche aber die Gruppen von der (haupt)Domain zu lesen. Durch LDAP habe ich da aber leider keinen Zugriff. Wenn ich es aber mit WINT mache kann ich schon auf die Gruppen der Domain zugreifen jedoch habe ich dann ein anderes Problem. Am Anfang hat auch alles in der Produktivumgebung mit WINT funktioniert. Dann wurde jedoch der TYp der Gruppen (zwecks Verwaltung) von "Global" auf "Universal" geändert und seit dem kann ich die Members der Gruppen nicht mehr auslesen. Da ich, wie gesagt, die ersten Versuche mit WINT gemacht habe, aber dann darauf gestoßen bin dass man nur mit LDAP verschachtelte Gruppen auslesen kann, habe ich mir gedacht dass ich die die Abfrage auf LDAP umstelle, jedoch geht es da dann überhaupt nicht, bzw. kann ich die localen Gruppen aus der subdomain lesen jedoch aber nicht nicht die Gruppen aus der (haupt)DOmain

Meine Frage wäre also ob jemand eine Info hat wieso ich die Members von universellen Gruppen nicht auslesen kann(wenn einzelne Gruppen auf Global geändert werden findet das PRogramm dann auch die richtige Zugehörigkeit) oder wie ich die Mitglieder bekommen kann

LG

fatality 15. Jun 2012 09:45

AW: Active Directory Gruppen in Gruppen ermitteln
 
Hat sich erledigt. Nachdem ich den Kunden überzeugen konnte Active Explorer auf den Rechner zu packen und an den "distinguishedname" gekommen bin, passt alles über LDAP.
Vielen Dank an chrisw

LG


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:37 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-2025 by Thomas Breitkreuz