2012-10-23 51 views
1

我正在使用德爾福pascal版本。 4 我有一個用戶名縮寫,需要從英文縮寫 獲取活動目錄顯示名稱,所以我不希望改變AD剛讀 - 函數會像這個漂亮:如何閱讀廣告displayname

fullname, user :string; 
user:='DKTB' 

(通話功能)

fullname:=getAdDispayName(user); 

(電話則全名=「託本·巴格」之後)我用谷歌找到它,但也僅僅能發現它在C和不帕斯卡。

+3

首先,我會下載['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

+2

@TLama:提及Jwa/Jwscl +1!上述示例代碼使用枚舉器查找在大型AD環境中可能需要很長時間的帳戶。對於這種操作,IDirectorySearch是更好的選擇! – Remko

回答

3

您可以使用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;