【问题标题】:How to read AD displayname如何读取 AD 显示名称
【发布时间】:2012-10-23 13:01:43
【问题描述】:

我正在使用 Delphi pascal 版本。 4 我有一个用户姓名首字母,需要从姓名首字母中获取活动目录显示名称 所以我不想改变 AD 只是读取 - 一个函数会像这样很好:

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

(调用函数)

fullname:=getAdDispayName(user);

(通话后全名 = 'Torben Bagge')

我用谷歌找到它,但只能在 C 中找到它,而不是 pascal。

【问题讨论】:

  • 首先我会下载JEDI JWSCL(此时SourceForge 似乎以某种方式被破坏了),其中包含JwaActiveDS 单元,其中包含使用AD 所需的所有东西。然后我会尝试翻译this之类的代码。
  • @TLama:+1 提到 Jwa/Jwscl!上述示例代码使用枚举器查找帐户,这在大型 AD 环境中可能需要很长时间。对于这种操作,IDirectorySearch 是更好的选择!

标签: delphi active-directory pascal


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多