AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Active Directory - Alle Benutzer auslesen - mit ActiveDS_TLB
Thema durchsuchen
Ansicht
Themen-Optionen

Active Directory - Alle Benutzer auslesen - mit ActiveDS_TLB

Offene Frage von "wschrabi"
Ein Thema von cherry · begonnen am 6. Dez 2007 · letzter Beitrag vom 20. Apr 2023
Antwort Antwort
Seite 2 von 3     12 3      
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
948 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS

  Alt 9. Dez 2007, 17:19
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ß
Angehängte Dateien
Dateityp: zip search_182.zip (194,9 KB, 146x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#2

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS

  Alt 10. Dez 2007, 10:56
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!
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
948 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS

  Alt 10. Dez 2007, 17:58
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ß
Angehängte Dateien
Dateityp: zip adserr_968.zip (1,5 KB, 89x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#4

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS

  Alt 18. Mär 2008, 09:31
ok habs schon fast, hoffe ich...

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
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#5

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS

  Alt 18. Mär 2008, 12:41
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])

[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:

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

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...

[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
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#6

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS

  Alt 18. Mär 2008, 15:30
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

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

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...
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
948 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS

  Alt 18. Mär 2008, 17:56
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.
Angehängte Dateien
Dateityp: zip search_200.zip (51,2 KB, 126x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#8

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS

  Alt 19. Mär 2008, 07:27
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?
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
948 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS

  Alt 19. Mär 2008, 17:34
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ß
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#10

Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS

  Alt 20. Mär 2008, 13:14
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
...

???
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:28 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