Einzelnen Beitrag anzeigen

Alter Mann

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

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