![]() |
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:
Keine Ahnung was WINDEFINES.INC ist... habe aber hier etw. gefunden:
[Pascal Fataler Fehler] AdsErr.pas(9): F1026 Datei nicht gefunden: 'WINDEFINES.INC'
![]() Nun kommt eine andere Meldung und zwar:
Delphi-Quellcode:
und es markiert diese Zeile:
[Pascal Fehler] frmMain.pas(152): E2010 Inkompatible Typen: 'Pointer' und 'ads_searchpref_info'
Delphi-Quellcode:
wie krieg ich nun diese Meldung weg? (danach kommen sicher nochmal n paar, aber ohne eure Hilfe schaff ich das eh net...)
if not SUCCEEDED(search.SetSearchPreference(opt, 1)) then
// EDIT: Hab nun auch diese Meldung weggebracht, indem ich in ActiveDS_TLB folgende Änderung vorgenommen habe:
Delphi-Quellcode:
aber wie es so ist, erhalte ich nun eine andere Fehlermeldung...
function SetSearchPreference( pSearchPrefs : ads_searchpref_info; // vorher " Pointer " #enemyleft 18.03.2008
dwNumPrefs : LongWord ): HResult; stdcall;
Delphi-Quellcode:
in den Zeilen:
[Pascal Fehler] frmMain.pas(173): E2003 Undefinierter Bezeichner: 'ObjectName'
Delphi-Quellcode:
// EDIT2:
if Included(SearchText, col.pAdsValues^.__MIDL_0010.BackLink.ObjectName) then
Items.Add(col.pszAttrName + ': ' + col.pAdsValues^.__MIDL_0010.BackLink.ObjectName); Ich hab die Zeile von
Delphi-Quellcode:
auf:
if Included(SearchText, col.pAdsValues^.__MIDL_0010.BackLink.ObjectName) then
Items.Add(col.pszAttrName + ': ' + col.pAdsValues^.__MIDL_0010.BackLink.ObjectName);
Delphi-Quellcode:
geändert... jetzt klappts...
if Included(SearchText, col.pAdsValues^.__MIDL_0010.DNString) then
Items.Add(col.pszAttrName + ': ' + col.pAdsValues^.__MIDL_0010.DNString); aber is doch irgendwie schräg.. naja |
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:
Die Zeile
Zugriffsveletzung bei der Adresse 76DE1D17 in Modul 'adsldpc.dll'. Schreiben von Adresse 00000025.
Delphi-Quellcode:
wird hierbei markiert...
if not SUCCEEDED(search.SetSearchPreference(opt, 1)) then
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... |
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. |
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? |
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ß |
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 ... ??? |
Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
?
Alles gelesen und fasst richtig verstanden!
Delphi-Quellcode:
In Properties werden alle Attribute gespeichert die gesucht werden sollen.
function DirectorySearch(Properties : Array of PWideChar;
SearchText : String; Category : String; out Items : TStringList) : Boolean; 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:
durch diese
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;
Delphi-Quellcode:
ersetzt werden. Nicht vergessen die Variable found : Boolean einzufügen.
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; Und Bitte nur Attribute verwenden die es gibt, es ist dies bezüglich keine Fehlerbehandlung vorhanden. |
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:
Der letzte Array Eintrag ist allerdings immer leer und ich frage mich sowieso, ob dieser Code "schön" ist oder nicht?!
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; Vielleicht sieht ja jmd gleich eine Verbesserung die gemacht werden könnte?! - Aber bei mir funktionierts auf jeden fall... :balloon: LG Cherry |
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 |
Re: Active Directory - Alle Benutzer auslesen - mit ActiveDS
Hi
Zitat:
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 ![]() 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ß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:19 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