您可以使用IDirectorySearch界面輕鬆完成此操作。我做了一個簡單的例子給你(不要忘了添加適當的錯誤處理):
uses
ActiveX,
JwaAdsTlb, JwaActiveDS; // From Jedi ApiLib
function GetADDisplayName(const Username: String): String;
var
hr: HRESULT;
DirSearch: IDirectorySearch;
SearchInfo: ADS_SEARCHPREF_INFO;
hSearch: ADS_SEARCH_HANDLE;
col: ADS_SEARCH_COLUMN;
Filter: String;
Attributes: array of PChar;
begin
Result := 'Undefined Result';
// Initialize COM
CoInitialize(nil);
try
// Change line below with your domain name
hr := ADsGetObject('LDAP://dc=contoso,dc=com',
IID_IDirectorySearch, Pointer(DirSearch));
Win32Check(Succeeded(hr));
SearchInfo.dwSearchPref := ADS_SEARCHPREF_SEARCH_SCOPE;
SearchInfo.vValue.dwType := ADSTYPE_INTEGER;
SearchInfo.vValue.Integer := ADS_SCOPE_SUBTREE;
hr := DirSearch.SetSearchPreference(@SearchInfo, 1);
Win32Check(Succeeded(hr));
Filter := Format('(&(objectClass=user)(sAMAccountName=%s))',
[Username]);
SetLength(Attributes, 1);
Attributes[0] := 'displayName';
// When using Dynamic Array with WinApi ALWAYS use pointer to first element!
hr := DirSearch.ExecuteSearch(PChar(Filter), @Attributes[0],
Length(Attributes), hSearch);
Win32Check(Succeeded(hr));
try
hr := DirSearch.GetFirstRow(hSearch);
Win32Check(Succeeded(hr));
hr := DirSearch.GetColumn(hSearch, Attributes[0], col);
if Succeeded(hr) then
begin
Result := col.pADsValues^.CaseIgnoreString;
DirSearch.FreeColumn(@col);
end;
finally
DirSearch.CloseSearchHandle(hSearch);
end;
finally
// UnInitialize COM
CoUninitialize;
end;
end;
首先,我會下載['JEDI JWSCL'(http://blog.delphi-jedi.net/security-圖書館/)(SourceForge目前似乎已被打破),它包含'JwaActiveDS'單元,它具有與AD一起工作所需的所有東西。然後我會嘗試翻譯像['this']這樣的代碼(http://forums.codeguru.com/showthread.php?474513-Visual-C-General-How-to-get-user-details-from-Active-目錄)。 – TLama
@TLama:提及Jwa/Jwscl +1!上述示例代碼使用枚舉器查找在大型AD環境中可能需要很長時間的帳戶。對於這種操作,IDirectorySearch是更好的選擇! – Remko