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ß