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/)
-   -   Probleme mit ADSI (https://www.delphipraxis.net/114942-probleme-mit-adsi.html)

siles 3. Jun 2008 09:21


Probleme mit ADSI
 
Hi
Ich versuche jetzt seit 2 Tagen eine einfache ADSI Verbindung herzustellen, aber es klappt einfach nicht :evil:
Mittels Google findet man genau eine...eine einzige Anleitung zu Adsi mit Delphi und die ist kompliziert, unvollständig und englisch geschrieben. Selbstverständlich wurden bei dem Code den man da downloaden kann noch 200 externe Komponenten hinzugefügt, damit man es jaaa nicht ausführen kann.

Ich brauche keinen Schreibzugriff oder so, sondern nur die Möglichkeit:
-Alle User aufzulisten
-Alle Gruppen aufzulisten
---Die User einer Gruppe aufzulisten
-Nach einem einzelnen User zu suchen
---Seine Gruppen anzuzeigen

Delphi-Quellcode:
procedure TForm2.initAdsi(Sender: TObject);
var
  aDomain : IAdsContainer;
  aUsers : IEnumVariant;
  aUser  : IADsUser;
  aGroup : IADsGroup;
  V      : OleVariant;
  w      : DWord;
  VA     : Variant;
  bind   : String;
  user   : String;
begin
bind:='LDAP://OU=***,OU=***,DC=***,DC=***,DC=***';
  // Interface für die Domäne anfordern
  aDomain := GetObject(bind) as IAdsContainer;
  VA := VarArrayCreate([ 0, 0 ], varVariant);
  VA[0] := 'user';
  aDomain.Filter := VA;
  aUsers := (aDomain._NewEnum) as IEnumVariant;
  while aUsers.Next(1, V, w) = S_OK do
  begin
    user := aUser.Name;
    if user = 'muster thomas' then begin
        ShowMessage(aUser.Department);
    end;
  end;
end;
Ich dachte mir, so irgendwie könnte ich mal einen User finden, aber falsch gedacht...gefunden habe ich nur Zugriffsverletzungen :(

Hat jemand von euch schonmal mit ADSI gearbeitet und hat ein einfaches (!!!!) Beispiel?

Alter Mann 3. Jun 2008 16:57

Re: Probleme mit ADSI
 
Hi,

warum Google, wenn alles in der DP zu finden ist?
Zum einstiegt reichen diese (exemplarischen) Beiträge:
Was ist LDAP, wie benutzte ich LDAP mit Delphi
und
AD zugriff mit ActiveDs_TLB und adshlp - www.agnisoft.com.

Für weiterführende Geschichten schön die DP-Suche nutzen.

Gruß

Remko 3. Jun 2008 21:36

Re: Probleme mit ADSI
 
Posted a sample using Jwa yesterday: http://www.delphipraxis.net/internal...t.php?t=135542

This is a snippet from one of my old programs that enumerates all objects in the Active Directory into a treeview
Delphi-Quellcode:
uses
   ActiveDS_TLB, AdsHlp, ActiveX, ComObj; // AdsHlp is a helper unit from agnisoft

...

procedure TADTreeThread.Execute;
var hr: hResult;
  objrootDSE: IADS;
  objContainer: IADS;
  sPath: string;
begin
  CoInitialize(nil);
  try
    hr := ADsGetObject(WideString('LDAP://rootDSE'), IID_IADS, objrootDSE);
  except
    on E: Exception do
    begin
     Exit;
    end;
  end;
  if Failed(hr) then exit;
  sPath := Format('LDAP://%s', [VarToStr(objrootDSE.Get('defaultNamingContext'))]);
  hr := ADsGetObject(sPath, IADS, objContainer);
  if Failed(hr) then exit;
  fRootNode := fADTree.Items.Add(nil, StringReplace(objContainer.Name, 'DC=', '', [rfReplaceAll]));
  with fRootNode do
  begin
    Data := TNodeData.Create;
    TNodeData(Data).Filled := True;
    TNodeData(Data).sAdsPath := sPath;
    TNodeData(Data).sClass := objContainer.Class_;
    ImageIndex := frMain.Icons.AD;
  end;
  EnumAndAdd(fRootNode, (objContainer as IADSContainer), VarArrayOf(['organizationalUnit', 'container']));
  objContainer := nil;
  objrootDSE := nil;
  CoUnInitialize;
end;

procedure TADTreeThread.EnumAndAdd(ParentNode: TTreeNode; objContainer: IADSContainer; Filter: OleVariant);
var Enum: IEnumVariant;
  Fetched: Cardinal;
  ResultItem: OleVariant;
  objAD: IADS;
  NewNode: TTreeNode;
begin
//  fADTree.Items.BeginUpdate;
  if Assigned(objContainer) then
  begin
    objContainer.Filter := Filter;
    Enum := objContainer._Newenum as IEnumVariant;
    Enum.Reset;
    Enum.Next(1, ResultItem, Fetched);
    while Fetched = 1 do begin
      objAD := IDispatch(ResultItem) as IADS;
      if objAD.Class_ = 'user' then
      begin
        with fADTree.Items.AddChild(ParentNode, StringReplace(StringReplace(objAD.Name, 'CN=', '', [rfIgnoreCase]), '\,', '', [rfIgnoreCase])) do
        begin
          ImageIndex := IconRecord.User;
          SelectedIndex := IconRecord.User;
          Data := TNodeData.Create;
          TNodeData(Data).sAdsPath := objAD.ADsPath;
          TNodeData(Data).sClass := objAD.Class_;
          TNodeData(Data).Filled := True;
        end;
      end
      else if objAD.Class_ = 'group' then
      begin
        with fADTree.Items.AddChild(ParentNode, StringReplace(objAD.Name, 'CN=', '', [rfIgnoreCase])) do
        begin
          ImageIndex := IconRecord.Users;
          SelectedIndex := IconRecord.Users;
          Data := TNodeData.Create;
          TNodeData(Data).sAdsPath := objAD.ADsPath;
          TNodeData(Data).sClass := objAD.Class_;
          TNodeData(Data).Filled := True;
        end;
      end
      else if objAD.Class_ = 'organizationalUnit' then
      begin
        NewNode := FADTree.Items.AddChild(ParentNode, StringReplace(objAD.Name, 'OU=', '', [rfIgnoreCase]));
        with NewNode do
        begin
          ImageIndex := IconRecord.ADOU;
          SelectedIndex := IconRecord.ADOU;
          Data := TNodeData.Create;
          TNodeData(Data).sAdsPath := objAD.ADsPath;
          TNodeData(Data).sClass := objAD.Class_;
          FADTree.Items.AddChild(NewNode, 'dummy');
          if NewNode <> nil then
          begin
//            EnumAndAdd(NewNode, (objAD as IADSContainer), Filter);
          end;
        end;
      end
      else if objAD.Class_ = 'container' then
      begin
        NewNode := fADTree.Items.AddChild(ParentNode, StringReplace(objAD.Name, 'CN=', '', [rfIgnoreCase]));
        with NewNode do
        begin
          ImageIndex := IconRecord.ADCont;
          SelectedIndex := IconRecord.ADCont;
          Data := TNodeData.Create;
          TNodeData(Data).sAdsPath := objAD.ADsPath;
          TNodeData(Data).sClass := objAD.Class_;
//          EnumAndAdd(NewNode, (objAD as IADSContainer), Filter);
          fADTree.Items.AddChild(NewNode, 'dummy');
        end;
      end;
      Enum.Next(1, ResultItem, Fetched);
    end;
  NewNode := nil;
  NewNode.Free;
  objAD := nil;
  end;
//  fADTree.Items.EndUpdate;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:08 Uhr.

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