【问题标题】:Active Directory in DelphiDelphi 中的活动目录
【发布时间】:2013-10-27 14:16:12
【问题描述】:

*我使用了这个代码: 但在 ADS_SEARCH_HANDLE 上有一个错误 任何人都可以帮助我吗?*

代码:

unit Unapp;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TFormApp = class(TForm)
    Button1: TButton;
  private
     function GetADDisplayName(const Username: String): String;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormApp: TFormApp;

implementation
uses
  ActiveX,
  JwaAdsTlb, JwaActiveDS; // From Jedi ApiLib

{$R *.dfm}
function TFormApp.GetADDisplayName(const Username: String): String;
var
  hr: HRESULT;
  DirSearch: IDirectorySearch;
  SearchInfo: ADS_SEARCHPREF_INFO;
  hSearch: ADS_SEARCH_HANDLE; // ************this has error**************
  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=Tbco,dc=com',
      IID_IDirectorySearch, Pointer(DirSearch));
    Win32Check(Succeeded(hr));

    SearchInfo.dwSearchPref   := ADS_SEARCHPREF_SEARCH_SCOPE;
    SearchInfo.vValue.dwType  := ADSTYPE_INTEGER;
    SearchInfo.vValue.dwType := 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(PWideChar(Filter),PWideChar(Attributes[0]),Length(Attributes), Pointer(hSearch));
    Win32Check(Succeeded(hr));

    try
      hr := DirSearch.GetFirstRow(Pointer(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;

end.

德尔福错误; [错误] Unapp.pas(33):未声明的标识符:'ADS_SEARCH_HANDLE' [错误] Unapp.pas(70): 实际和形式 var 参数的类型必须相同 [错误] Unapp.pas(70):不兼容的类型:“Char”和“WideChar” [错误] Unapp.pas(73):未声明的标识符:'CaseIgnoreString' [错误] Unapp.pas(74): 实际和形式 var 参数的类型必须相同 [错误] Unapp.pas(77): 实际和形式 var 参数的类型必须相同 [致命错误] ProjApp.dpr(5):无法编译使用的单元“Unapp.pas”

【问题讨论】:

  • 能否请您发布完整的错误消息并在您的代码中指出相应的行?
  • 你没有初始化DirSearch
  • 是的,我使用该代码,但它不起作用?因为 ADS_SEARCH_HANDLE。你能帮我吗?
  • 嗨,Alexander,我发送了原始代码和 delphi 错误,您能帮帮我吗?

标签: delphi active-directory


【解决方案1】:

看起来DirSearch 没有初始化

使用此代码来初始化它

    AdsGetObject(PWideChar('LDAP://YourDomain'), IDirectorySearch, DirSearch);

不要忘记将 YourDomain 替换为您的实际域

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多