【问题标题】:ADSI can't open object using ADsOpenObject. DelphiADSI 无法使用 ADsOpenObject 打开对象。德尔福
【发布时间】:2014-05-15 10:30:52
【问题描述】:

我有一个允许使用 windows 登录信息登录的程序,我试图在用户输入密码时获取 windows 组成员,我写了一个类似于我的代码的小函数:

procedure ShowADSPath(UserName, Password: widestring);
var Group :    IADs;
begin
  try
      OleCheck(ADsOpenObject('WinNT://Server/Group1',
       UserName,
       Password, ADS_SECURE_AUTHENTICATION, IADs, Group));
       if (Group <> nil) and (Group.Class_ = 'Group') then
         ShowMessage(Group.ADsPath);
       Group.release;  
       Group:= nil;
  except
     ShowMessage('NOT ACCESSDE');
  end;
end;

所以当输入的用户名和密码正确时,程序会返回组的路径 当出现错误的“未访问”时。

如果我第一次输入正确的用户名和密码,或者输入错误的用户名和密码数据,该功能也可以正常工作。

问题是当我第二次调用该函数时,它不能按预期工作:

当我运行我的程序并首先输入错误的密码并调用我的函数时,“未访问”将按预期显示,但如果我使用正确的密码调用该函数,它也会返回“未访问”。

另外,当我运行我的程序并首先输入正确的密码并调用我的函数时,组路径会按预期显示,但如果我用错误的密码调用函数,它也会返回路径。

我的连接数据似乎已保存,我需要释放内存但我不知道如何。

任何机构都可以提供帮助?

【问题讨论】:

    标签: delphi adsi


    【解决方案1】:

    我终于可以找到我的问题的解决方案,它看起来像本文中描述的 Microsoft API 问题: http://support.microsoft.com/kb/218497

    实际上 API 函数 ADsOpenObject 正在使用您传递的凭据打开与服务器的连接,但它从未关闭该连接,我试图关闭它,但它在会话中没有关闭,所以我首先使用另一个 API 来检查对象的存在,看看它对我有用的这个函数:

    procedure ShowADSPath(UserName, Password: widestring);
        function CheckObject(APath: String): IDispatch;
        var
          Moniker: IMoniker;
          Eaten: integer;
          BindContext: IBindCtx;
          Dispatch: IDispatch;
        begin
          Result := nil;
          OleCheck(CreateBindCtx(0, BindContext));
          OleCheck(MkParseDisplayName(BindContext, PWideChar(WideString(APath)), 
                                           Eaten, Moniker));
          OleCheck(Moniker.BindToObject(BindContext, nil, IDispatch, Dispatch));
    
          Result := Dispatch;
        end;
    var Group :    IADs;
    begin
      try
        if CheckObject('WinNT://Server/Group1,group') <> nil then
             OleCheck(ADsOpenObject('WinNT://Server/Group1,group',
               UserName,
               Password, ADS_SECURE_AUTHENTICATION, IADs, Group));
           if (Group <> nil) and (Group.Class_ = 'Group') then
           begin
             ShowMessage(Group.ADsPath);
             Group.release;  
             Group:= nil;
           end;
      except
         ShowMessage('NOT ACCESSDE');
      end;
    end;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 1970-01-01
      • 2013-03-19
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多