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 - Alle Benutzer auslesen - mit ActiveDS_TLB (https://www.delphipraxis.net/104548-active-directory-alle-benutzer-auslesen-mit-activeds_tlb.html)

cherry 6. Dez 2007 07:59


Active Directory - Alle Benutzer auslesen - mit ActiveDS_TLB
 
Hi @ all

Ich möchte eigentlich nach einem Benutzer im AD suchen, jedoch nicht nach dem "Username" sondern nach dem "Displayname" oder "Fullname". Da ich denke, dass ActiveDS_TLB keine Funktion dafür vorsieht, dachte ich: Ich lese zuerst alle Benutzer des AD aus und Suche dann nach dem "Displayname" oder "Fullname"...

Nur... wie macht man das?

Alter Mann 6. Dez 2007 08:38

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
 
Hi cherry,

falsch gedacht. In den Beispielen von Agni Software ist auch eins für directorysearch.

Gruß

cherry 6. Dez 2007 10:48

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
 
Hey Alter Mann...

Vielen Dank für deine schnelle Antwort, das hat mir schon "etwas" weitergeholfen. Ich schaffe es nun mit folgendem, von mir abgeändertem, AgnisoftCode eine Liste aller User zu bekommen.

Ok ich hab nun eine Liste der DisplayNames aller Benutzer, nur habe ich den Usernamen aber nicht dazu, den brauche ich jetzt auch nocht. Eine Idee?

Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var obj : IAds;
    search : IDirectorySearch;
    tst : PWideChar;
    p : array[0..0] of PWideChar;
    cls : IADsClass;
    cont : IADsContainer;
    i : integer;
    ptrResult : THandle;
    col : ads_search_column ;
    hr : HResult;
    opt : array[0..0] of ads_searchpref_info; // has to be an array
    dwErr : DWord;
    szErr : array[0..255] of WideCHar;
    szName : array[0..255] of WideChar;
begin
   lbDsSearch.Items.CLear;
   AdsGetObject(edtDSPath.Text, IDirectorySearch, search);
   try
     p[0] := StringToOleStr('Name');
     opt[0].dwSearchPref := ADS_SEARCHPREF_SEARCH_SCOPE;
     opt[0].vValue.dwType := ADSTYPE_INTEGER;
     opt[0].vValue.Integer := ADS_SCOPE_SUBTREE;
     hr := search.SetSearchPreference(@opt[0],1);
     if (hr <> 0) then
       begin
         hr := ADsGetLastError(dwErr, @szErr[0], 254, @szName[0], 254);
         ShowMessage(WideCharToString(szErr));
         Exit;
       end;
     hr := search.ExecuteSearch('(objectCategory=User)',@p[0], 1, ptrResult);
     hr := search.GetNextRow(ptrResult);
     while (hr <> S_ADS_NOMORE_ROWS) do
     begin
        hr := search.GetColumn(ptrResult, p[0],col);
        if Succeeded(hr) then
        begin
          if col.pADsValues <> nil then
            lbDsSearch.Items.Add(col.pAdsvalues^.CaseIgnoreString);
          search.FreeColumn(col);
        end;
        Hr := search.GetNextRow(ptrResult);
     end;
   finally
   end;
end;
cheers

MarLe 6. Dez 2007 15:17

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
 
... vielleicht hilft folgendes

Delphi-Quellcode:
...
function ADsGetObject(pwcPathName: PWideChar; const xRIID: TGUID; var pVoid): HResult; stdcall; external 'activeds.dll';
...
function TForm1.GetUserFullname(Domain, Username: String): string;
var
  usr: IADSUser;
  pc:array[0..255] of WideChar;
  s:String;
begin
  s:='WinNT://' + Domain + '/' + username;
  StringToWideChar(S,PC,Length(S)+1);

  ADsGetObject(pc, IADsUser, usr);
  if not Assigned(usr) then
    result := 'Unknown'
  else
    result := usr.FullName;
end;
Gruß MarLe

cherry 6. Dez 2007 16:34

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
 
@MarLe

ne, eben nicht. Du hast mich wohl falsch verstanden. Ich will den Full- oder Displayname eingeben und den Username erhalten. Das ist genau das umgekehrte von dem was du mir vorgeschlagen hast. Du gibst den Username ein und erhälst den Fullname, das hab ich bereits in mein Programm implementiert.

Danke trotzdem...

noch jmd eine Idee?

Alter Mann 6. Dez 2007 17:55

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
 
Hallo cherry,

du kommst an MSDN ran? Wenn Ja schau dir mal die Erläuterungen zu ExecuteSearch an.
Wenn Nein wirst Du warten müssen bis ein anderer Hilfestellung gibt, da ich noch nicht weiß
ob ich am Wochenende dazu komme.

Das kurze Beispiel:
Zitat:

LPWSTR pszAttr[] = { L"ADsPath", L"Name", L"samAccountName" };
ADS_SEARCH_HANDLE hSearch;
DWORD dwCount= sizeof(pszAttr)/sizeof(LPWSTR);

// Search for users with a last name that begins with "h".
hr = m_pSearch->ExecuteSearch(L"(&(objectClass=user)(sn=h*))", pszAttr, dwCount, &hSearch );

Gruß

Alter Mann 9. Dez 2007 17:19

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo cherry,

habe doch noch 2-3 Stunden Zeit gefunden.
Anbei ein kleines Programm(D7) mit dem du nach beliebigen Einträgen suchen kannst.
Du solltest immer den distinguishedName mit rein nehmen, da du so bequemer
auf das Objekt zugreifen kannst.

@all

Während der Umsetzung ist mir aufgefallen, das der Import der ActiveDs_TLB nicht
richtig funktioniert, so wurde aus THandle ein Pointer bei IDirectorySearch.
Auch wurden einige Typdeklarationen, verglichen mit MSDN geändert(siehe u.a. _adsvalue).

Gibt es dafür eine Erklärung, oder ist es Bug?

Zurück zum Programm.

Die Kernfunktion ist DirectorySearch:
Delphi-Quellcode:
function TIDirectorySearchForm.DirectorySearch(Properties : Array of PWideChar;
                                               SearchText : String;
                                               Category  : String;
                                               out Items : TStringList) : Boolean;

  function Included(str1, str2 : String) : boolean;
  var
    s1, s2 : String;
  begin
    s1 := UpperCase(Str1);
    s2 := UpperCase(Str2);
    Result := POS(s1, s2) <> 0;
  end;
var
  Search   : IDirectorySearch;
  ptrResult : THandle;
  col      : ads_search_column;
  hr       : HResult;
  opt      : ads_searchpref_info;
  dwCount  : DWORD;
  dwErr    : DWord;
  szErr    : array[0..255] of WideCHar;
  szName   : array[0..255] of WideChar;
  idx      : Integer;
begin
  if SUCCEEDED(ADsGetObject(edtADsPath.Text, IDirectorySearch, Search)) then
  begin
    try
      opt.dwSearchPref  := ADS_SEARCHPREF_SEARCH_SCOPE;
      opt.vValue.dwType := ADSTYPE_INTEGER;
      opt.vValue.__MIDL_0010.Integer := ADS_SCOPE_SUBTREE;
      if not SUCCEEDED(search.SetSearchPreference(opt, 1)) then
      begin
         ADsGetLastError(dwErr, @szErr[0], 254, @szName[0], 254);
         ShowMessage(WideCharToString(szErr));
         Result := False;
         Exit;
      end;
        dwCount := Length(Properties);
        hr := search.ExecuteSearch(StringToOleStr('(objectCategory=' + Category + ')'), @Properties[0], dwCount, ptrResult);
        if SUCCEEDED(hr) then
        begin
          hr := search.GetNextRow(ptrResult);

          while (hr <> S_ADS_NOMORE_ROWS) do
          begin
             for idx := 0 to dwCount -1 do
             begin
               if Succeeded(search.GetColumn(ptrResult, Properties[idx], col)) then
               begin
                 if col.pADsValues <> nil then
                 begin
                   if Included(SearchText, col.pAdsValues^.__MIDL_0010.BackLink.ObjectName) then
                   Items.Add(col.pszAttrName + ': ' + col.pAdsValues^.__MIDL_0010.BackLink.ObjectName);
                 end;
                 search.FreeColumn(col);
               end;
             end;
             hr := search.GetNextRow(ptrResult);
          end;
        end;
    finally
    end;
  end;
  Result := Items.Count -1 <> -1;
end;
Im Grunde unterscheidet sich sich nicht groß vom Original, die Änderungen betreffen in diesem Zusammenhang
nur die Abfrage der gesuchten Eigenschaften und der damit Verbundene Zugriff auf BackLink.

Die kleine Funktion Included musste sein, da POS direkt so mit den Werten nicht wollte.

Für den Rest siehe Anhang.

Gruß

cherry 10. Dez 2007 10:56

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
 
Hi Alter Mann

Du bist ja der Hammer, so wie du dich da ins Zeug gelegt hast. Nur leider bring ich das Programm hier nicht zum laufen. Ich kann zwar prima in der Domänenstrucktur herumnavigieren, aber der "search" Button reagiert nicht... egal aus welcher Kategorie ich suche oder was für einen Suchbegriff ich eingebe, nichts passiert. Ich wollte grade eben mal testen ob der Button in die Routine kommt, aber da fehlt mir wahrscheinlich noch ne Unit...

Ich hab schon mal gesehen dass du "ActiveDs_TLB" und "ADsHlp" verwendest. Die Unit "adsErr" ist mir aber unbekannt... Wo krieg ich die her?

Naja du hast schon so viel Aufwand betrieben, ich kann auch verstehen wenn du von einem Anfänger wie mir die Schnauze voll hast! ;-)

Alter Mann 10. Dez 2007 17:58

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ups, vergessen?

Kaum, ich dachte eigentlich das sie bei Agni dabei ist.

Das mit dem Suchen sollte aber trotzdem funktionieren.

1. Bei ADs die zu durchsuchenden Domäne eintragen bzw. rechts daneben auf den SpeedButton klicken
und die Domäne auswählen.

2. Den Suchbegriff eintragen, z.B. Benutzernamen

3. Was suchen wir den Benutzer, Computer oder etwas anderes?

4. Alle zu durchsuchenden Eigenschaften(Attribute) eintragen.

5. Searching-Button anklicken.

Beispiel

1) LDAP://DC=xx,DC=xxxx,DC=xx <- Ist kein Link, wird nur so dargestellt!
2) Administrator
3) user
4) sn, displayName, distinguishedName, userPrincipalName
5) (Klick)

Wichtig ist der Zusammenhang zwischen 2, 3 und 4. Es macht keinen Sinn den Familiennamen eines Benutzer einzugeben,
die ObjectCategory user zuwählen und nur nach dem sAMAccountNamen zu suchen, der Beispielhaft aus einer Zahlenfolge
besteht.

Sollte der Compiler rum maulen das die vorhandenen Parameter den tatsächlichen Parametern entsprechen müssen
(bei GetNextRow), dann liegt es am Tyblib-Import. Die Lösung alle Pointer innerhalb von IDirctorySearch in THandle
ändern.

Gruß

cherry 18. Mär 2008 09:31

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
 
ok habs schon fast, hoffe ich... :oops:

Kann das Projekt (dein Projekt, AlterMann) aber noch nicht kompillieren. Ich erhalte die Fehlermeldung:

[Pascal Fehler] frmMain.pas(151): E2003 Undefinierter Bezeichner: '__MIDL_0010'


//EDIT

Vielleicht liegst auch daran, dass ich zuerst nicht kompillieren konnte weil die Datei {$I WINDEFINES.INC} in Untit AdsErr fehlte...
ich habe die Datei einfach runtergeladen und im Suchverzeichnis des Projekts ergänzt.

JMD eine Idee

cherry 18. Mär 2008 12:41

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
 
Hey alter Mann...

viellecht kannst du mir ja helfen. Ich verzweifle an dem Versuch dein Code mit BDS 2005 zu compillieren...

Ich denke es liegt evt. An der ActiveDS_TLB ?! oder an mir. Ich kann es drehen wie ich will, ich brings nicht zustande alle Fehler zu beheben, sodass ich das Programm kompillieren kann.

Wenn ich den Code so nehme wie du ihn hier hochgestellt hast, erhalte ich folgenden Pascal Fehler:
(Hab deine losen Dateien in ein Projekt zusammengefasst und die Units: ActiveDs_TLB, ADsHlp, AdsErr; verlinkt.. [uses])

Delphi-Quellcode:
[Pascal Fataler Fehler] AdsErr.pas(9): F1026 Datei nicht gefunden: 'WINDEFINES.INC'
Keine Ahnung was WINDEFINES.INC ist... habe aber hier etw. gefunden: http://www.koders.com/noncode/fid51D92531297E3E551D073B83B780F0EC12AF01D7.aspx. Habe die Datei dort mal heruntergeladen und dem Projekt zugänglich gemacht. -> Die Fehlermedlung verschwindet...

Nun kommt eine andere Meldung und zwar:

Delphi-Quellcode:
[Pascal Fehler] frmMain.pas(152): E2010 Inkompatible Typen: 'Pointer' und 'ads_searchpref_info'
und es markiert diese Zeile:

Delphi-Quellcode:
if not SUCCEEDED(search.SetSearchPreference(opt, 1)) then
wie krieg ich nun diese Meldung weg? (danach kommen sicher nochmal n paar, aber ohne eure Hilfe schaff ich das eh net...)

// EDIT:

Hab nun auch diese Meldung weggebracht, indem ich in ActiveDS_TLB folgende Änderung vorgenommen habe:

Delphi-Quellcode:
function SetSearchPreference(        pSearchPrefs     : ads_searchpref_info; // vorher " Pointer " #enemyleft 18.03.2008
                                          dwNumPrefs       : LongWord ): HResult; stdcall;
aber wie es so ist, erhalte ich nun eine andere Fehlermeldung...

Delphi-Quellcode:
[Pascal Fehler] frmMain.pas(173): E2003 Undefinierter Bezeichner: 'ObjectName'
in den Zeilen:

Delphi-Quellcode:
if Included(SearchText, col.pAdsValues^.__MIDL_0010.BackLink.ObjectName) then
                     Items.Add(col.pszAttrName + ': ' + col.pAdsValues^.__MIDL_0010.BackLink.ObjectName);
// EDIT2:

Ich hab die Zeile von

Delphi-Quellcode:
if Included(SearchText, col.pAdsValues^.__MIDL_0010.BackLink.ObjectName) then
                     Items.Add(col.pszAttrName + ': ' + col.pAdsValues^.__MIDL_0010.BackLink.ObjectName);
auf:

Delphi-Quellcode:
if Included(SearchText, col.pAdsValues^.__MIDL_0010.DNString) then
                     Items.Add(col.pszAttrName + ': ' + col.pAdsValues^.__MIDL_0010.DNString);
geändert... jetzt klappts...
aber is doch irgendwie schräg.. naja

cherry 18. Mär 2008 15:30

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
 
Ich konnte das Programm von alterMann jetzt zwar kompillieren, aber manchmal! treten komische Fehler auf...
ich kann im Moment noch keine logische Regelmäsigkeiten feststellen...

je nachdem wieviele und welche Propertys ich mitgebe... Manchmal gehts machmal nicht ?!


aber es ist eine

Delphi-Quellcode:
Zugriffsveletzung bei der Adresse 76DE1D17 in Modul 'adsldpc.dll'. Schreiben von Adresse 00000025.
Die Zeile

Delphi-Quellcode:
if not SUCCEEDED(search.SetSearchPreference(opt, 1)) then
wird hierbei markiert...

Genau bei der Funktion die ich in ActiveDs_TLB etwas angepasst habe.. ich habe den Parametertyp von Pointer auf ads_searchpref_info
ändern müssen damit ich das Projekt kompillieren konnte.

Wär toll wenn mir noch jmd sagen kann was ich falsch mache...

Alter Mann 18. Mär 2008 17:56

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo cherry,

ich werde mich des Problems annehmen.
Es gab damals einige Ungereimtheiten, da der Typlib-Import andere Deklarationen zu Tage brachte
als in der MSDN vermerkt.
Falls ich es schaffe werden ich diesmal (hoffentlich) alles beilegen.

Bis bald.

Edit:

Anbei ein vollständiges? Beispiel für BDS 2K5U1, getestet.

cherry 19. Mär 2008 07:27

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
 
Super alterMann, vielen Dank. Das zweite Programm funktioniert... ich habe gesehen, dass es fast gleich ausschaut wie mein abgeändertes der ersten Version.

Ich habe noch eine Zwischenfrage die sicher schnell beantwortet ist. Denn ich werde das Gefühl nicht los, dass ich den sAMAccountName mit diesem Programm nicht auslesen kann. Ist das so? wie krieg ich den?

Alter Mann 19. Mär 2008 17:34

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
 
Hallo cherry,

der sAMAccountName kann damit ausgelesen werden, der Eintrag muss sich in der Liste s.o. Punkt 4 befinden.
Bitte auch das Beispiel und den Nachastz bei #9 beachten, vielleicht liegt es ja daran?

Gruß

cherry 20. Mär 2008 13:14

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
 
Versteh ich das richtig...
Die Funktion gibt Übereinstimmungen von SearchText und den angegebenen Properties zurück?! Ich kann z.B. nicht nur nach cn suchen, und dabei mehrere Werte zurück erhalten? -Es wird immer in allen Properties nach Übereinstimmungen gesucht?

- und gibt mir auch nur die Properties zurück in denen was gefunden wurde?

Und was wenn ich nach cn suchen will und folgende Werte erhalten möchte

sAMAccountName
mail
...

???

Alter Mann 20. Mär 2008 17:55

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
 
?

Alles gelesen und fasst richtig verstanden!

Delphi-Quellcode:
    function DirectorySearch(Properties : Array of PWideChar;
                             SearchText : String;
                             Category  : String;
                             out Items : TStringList) : Boolean;
In Properties werden alle Attribute gespeichert die gesucht werden sollen.
Wenn also der sAMAccountName vom User "Franz Mustermann" gesucht wird, dann
muss im Array das Attribut 'sAMAccountName' vorhanden sein, als auch ein Attribut
in dem der Name des Benutzers vorkommen muss.

In diesem Fall also die Attribute 'cn' und 'sAMAccountName'.

[Edit]

Damit das ganze dann auch funktionieren soll, muss in der function DirectorySearch
folgende Passage
Delphi-Quellcode:
        if SUCCEEDED(hr) then
        begin
          hr := search.GetNextRow(ptrResult);

          while (hr <> S_ADS_NOMORE_ROWS) do
          begin
             for idx := 0 to dwCount -1 do
             begin
               if Succeeded(search.GetColumn(ptrResult, Properties[idx], col)) then
               begin
                 if col.pADsValues <> nil then
                 begin
                   if Included(SearchText, col.pAdsValues^.__MIDL_0010.BackLink.ObjectName) then
                   Items.Add(col.pszAttrName + ': ' + col.pAdsValues^.__MIDL_0010.BackLink.ObjectName);
                 end;
                 search.FreeColumn(col);
               end;
             end;
             hr := search.GetNextRow(ptrResult);
          end;
        end;
durch diese
Delphi-Quellcode:
        if SUCCEEDED(hr) then
        begin
          hr := search.GetNextRow(ptrResult);
          found := false;
          while (hr <> S_ADS_NOMORE_ROWS) do
          begin
             for idx := 0 to dwCount -1 do
             begin
               if Succeeded(search.GetColumn(ptrResult, Properties[idx], col)) then
               begin
                 if col.pADsValues <> nil then
                 begin
                   if not found then
                   begin
                     found := Included(SearchText, col.pAdsValues^.__MIDL_0010.BackLink.ObjectName);
                     if found then
                     Items.Add(col.pszAttrName + ': ' + WideCharToString(col.pAdsValues^.__MIDL_0010.BackLink.ObjectName));
                   end
                   else
                   Items.Add(col.pszAttrName + ': ' + WideCharToString(col.pAdsValues^.__MIDL_0010.BackLink.ObjectName));
                 end;
                 search.FreeColumn(col);
               end;
             end;
             hr   := search.GetNextRow(ptrResult);
             found := false;
          end;
        end;
ersetzt werden. Nicht vergessen die Variable found : Boolean einzufügen.

Und Bitte nur Attribute verwenden die es gibt, es ist dies bezüglich keine Fehlerbehandlung vorhanden.

cherry 26. Mär 2008 09:18

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
 
Super, genau das habe ich gewollt.

Nun möchte ich aber als Rückgabewert keine TStringList sondern ein Mehrdimensionales Dynamisches Array...
Ich hab das mal so gemacht:

Delphi-Quellcode:
type
  TItemArray = array of array of String;
Delphi-Quellcode:
function DirectorySearch(ADsPath: String; Properties : Array of PWideChar; SearchText : String; Category  : String) : TItemArray; stdcall;

  function Included(str1, str2 : String) : boolean;
  var
    s1, s2 : String;
  begin
    s1 := UpperCase(Str1);
    s2 := UpperCase(Str2);
    Result := POS(s1, s2) <> 0;
  end;
var
  Search   : IDirectorySearch;
  ptrResult : THandle;
  col      : ads_search_column;
  hr       : HResult;
  opt      : ads_searchpref_info;
  dwCount  : DWORD;
  dwErr    : DWord;
  szErr    : array[0..255] of WideChar;
  szName   : array[0..255] of WideChar;
  i,idx    : Integer;
  found, empty : Boolean;
begin
  if SUCCEEDED(ADsGetObject(ADsPath, IDirectorySearch, Search)) then
  begin
    try
      opt.dwSearchPref  := ADS_SEARCHPREF_SEARCH_SCOPE;
      opt.vValue.dwType := ADSTYPE_INTEGER;
      opt.vValue.__MIDL_0010.Integer := ADS_SCOPE_SUBTREE;
      if not SUCCEEDED(search.SetSearchPreference(opt, 1)) then
      begin
         ADsGetLastError(dwErr, @szErr[0], 254, @szName[0], 254);
         ShowMessage(WideCharToString(szErr));
         Exit;
      end;
        dwCount := Length(Properties);
        hr := search.ExecuteSearch(StringToOleStr('(objectCategory=' + Category + ')'), @Properties[0], dwCount, ptrResult);
        found := false;
        if SUCCEEDED(hr) then
        begin
          hr := search.GetNextRow(ptrResult);
          i := 0;
          while (hr <> S_ADS_NOMORE_ROWS) do
          begin

            setLength(Items, i+1, dwCount);
            empty := true;

            for idx := 0 to dwCount -1 do
            begin
             if Succeeded(search.GetColumn(ptrResult, Properties[idx], col)) then
             begin
               if col.pADsValues <> nil then
               begin
                 if not found then
                 begin
                   found := Included(SearchText, col.pAdsValues^.__MIDL_0010.BackLink.ObjectName);
                   if found then
                   begin
                     Items[i,idx] := col.pAdsValues^.__MIDL_0010.BackLink.ObjectName; {col.pszAttrName + ': ' +}
                     empty := false;
                   end;
                 end
                 else
                 begin
                   Items[i,idx] := col.pAdsValues^.__MIDL_0010.BackLink.ObjectName; {col.pszAttrName + ': ' +}
                   empty := false;
                 end;
               end;
               search.FreeColumn(col);
             end;
            end;
            hr := search.GetNextRow(ptrResult);
            found := false;

            if not empty then
              inc(i);

          end;
        end;
    finally
    end;
  end;

  Result := Items;
 
end;
Der letzte Array Eintrag ist allerdings immer leer und ich frage mich sowieso, ob dieser Code "schön" ist oder nicht?!
Vielleicht sieht ja jmd gleich eine Verbesserung die gemacht werden könnte?!

- Aber bei mir funktionierts auf jeden fall... :balloon:

LG Cherry

ducci 13. Mai 2008 08:10

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
 
Hi

habe auch das Beispielprogramm von @Alter Mann genutzt, erst einmal super lieben Dank!!

Was mir aber auffällt ist, suche ich z.b. nach sAMAccountname (im Include ist sn, mail, sAMAccountname,distinguishedName)
erhalte ich leider nur dann unter SearchResult einen Eintrag zum sAMAccountname und distinguishedName.
sn und mail sind leider leer, wo ist der Haken, irgendwas ist nicht OK oder ist es Ok und ich habe etwas falsch gemacht.

Denn ich würde gerne nach sAMAccountname suchen und alle anderen Attribute auslesen, geht das irgendwie??

Für Hilfe wäre ich sehr dankbar

Alter Mann 13. Mai 2008 18:50

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
 
Hi

Zitat:

Was mir aber auffällt ist, suche ich z.b. nach sAMAccountname (im Include ist sn, mail, sAMAccountname,distinguishedName)
erhalte ich leider nur dann unter SearchResult einen Eintrag zum sAMAccountname und distinguishedName.
Das kann, muss aber nicht ein Fehler sein. Es kommt darauf an wie die Konten angelegt werden/wurden.
sn ist zum Beispiel ein optionaler Wert, der angelegt werden kann, aber nicht muss.
Bei mail sieht es etwas anders aus, er wird angelegt wenn ein Mail-Server(ExChange ab 2003) verwendet wird,
der sich in die ADS einklinkt.

Die genaue Wertzuweisung kann in diesem Fall nur mit ADSIEDIT überprüft werden(ist auch in den Support-Tools W2K3 enthalten).

Kleiner Tipp an Rande: Die Abfrage von Werten bzw. die Zuweisung von weiteren optionalen Werten kurz nachdem
anlegen eines Benutzers machen keinen Sinn, da die ADS einige Sekunden braucht um die Werte zu replizieren
(Die Zeitspanne ist davon Abhängig wie viele Global Catalog - Server vorhanden sind).

Gruß

ducci 4. Jun 2008 09:19

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
 
Hallo Alter Mann

soweit funktioniert das mit dem auslesen von Benutzern, leider bekomme ich es einfach nicht hin
nach Gruppen zu suchen, scheint nicht zu funktionieren, kannst du noch einmal bitte nachschauen
ob evtl. da noch ein klitzekleiner Fehler enthalten ist..

Danke schon mal im voraus

Ducci

Alter Mann 5. Jun 2008 07:03

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
 
Hallo,

damit GetNextRow kein S_ADS_NOMORE_ROWS zurück gibt, ist der Eintrag 'groups' der cboObjectCategory-ComboBox in 'group' zu ändern.


Gruß

siles 6. Jun 2008 07:57

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
 
Das Beispiel ist gut. Doch kann man damit auch z.b. die Mitglieder einer bestimmten Gruppe anzeigen?
Oder die Gruppen eines Users anzeigen?

Alter Mann 6. Jun 2008 10:50

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
 
Hi siles,

schau dir die Beispiele von AGNISOFT an.
Dort ist unter anderem ein Benutzermanager drin, der genau das macht.

Gruß

siles 6. Jun 2008 13:33

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
 
Hallo Alter Mann.
Danke für den Tipp..die hab ich mir schonmal angeschaut.
Wären genau das richtige, nur gibt es da ein Problem:

Die machen das dort mit:
ADsGetObject('WinNT://Domain....

Wenn ich das bei uns so mache, bekomme ich alle User/Gruppen aus der gesamten Domäne (dem ganzen Unternehmen).
Ich möchte das jedoch einschränken können wie es mit ldap://ou=blabla möglich ist, damit ich nur die User/Gruppen aus unserem Standort bekomme.

Scheinbar verträgt sich IADsContainer nicht mit dem LDAP Zeug, jedenfalls bekomme ich keine Resultate zu sehen wenn ich statt dem WinNT Verbindungsstring einen LDAP String hinschreibe.

Alter Mann 6. Jun 2008 17:54

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
 
Hallo siles,

du meinst die Passage:
Delphi-Quellcode:
ADsGetObject('WinNT://' + FDomain + '/' + Node.Text, IADsUser, usr);
Ersetze diesen Teil "'WinNT://' + FDomain + '/' + Node.Text" durch den distingushedName.

Schau die auch diese Thread's an : Active Directory Gruppen in Gruppen ermitteln und Hilfsmittel zur Windows-Administration

Sollten weiterhin noch offene Fragen vorhanden sein, dann bitte den Einen oder Anderen neuen Thread aufmachen.

Noch soviel, die 'WinNT://'-Schiene ist der kleinste gemeinsame Nenner und wahrt die kompatibilität zu 'WinNT'.

Gruß

wschrabi 15. Apr 2023 15:33

AW: Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
 
Zitat:

Zitat von Alter Mann (Beitrag 711268)
Hi cherry,

falsch gedacht. In den Beispielen von Agni Software ist auch eins für directorysearch.

Gruß

Hallo lieber ALTER_MANN & Co,
ich möchte auch ein LDAP EMail Suche routine in mein Delphi Programm. Doch auf der Agnissoft seite finde ich nix mehr dazu. Ist das freeware oder gibts kommerzielle Tools die LDAP EMAILs suche ermöglichen? DANKE:oops:

Alter Mann 15. Apr 2023 18:11

AW: Active Directory - Alle Benutzer auslesen - mit ActiveDS_TLB
 
Echt Jetzt?
Oh man, da musste ich ganz schön in der Vergangenheit rumstochern und hab nix gefunden:(.

Aber dafür gibt es ja Google, oder nicht?

VG

Alter Mann 20. Apr 2023 07:48

AW: Active Directory - Alle Benutzer auslesen - mit ActiveDS_TLB
 
Nachtrag,

auch als Quelle gut geeignet: LDAPAdmin

wschrabi 20. Apr 2023 08:31

AW: Active Directory - Alle Benutzer auslesen - mit ActiveDS_TLB
 
Zitat:

Zitat von alter mann (Beitrag 1521264)
nachtrag,

auch als quelle gut geeignet: ldapadmin

danke vielmals !


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:23 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