3

我有一段用 Delphi 2005 编写的代码,用于在 LDAP 中搜索用户的特定属性。当它在 Windows 7 或 Server 2008 上运行时出现访问冲突,但在 XP 或 2003 上没有。

Function IsSSOUser(UserId: String): Boolean;
var
  S : string;
  ADOQuery : TADOQuery;
  ADOConnectionSSO: TADOConnection;
begin
  result := false;
  Setdomainname;
  ADOQuery := TADOQuery.Create(nil);
  ADOConnectionSSO := TADOConnection.Create(nil);
  try
    ADOConnectionSSO.LoginPrompt := false;
    ADOConnectionSSO.Mode := cmRead;
    ADOConnectionSSO.Provider := 'ADsDSOObject';
    ADOQuery.Connection := ADOConnectionSSO;
    ADOQuery.ConnectionString := 'Provider=ADsDSOObject;Encrypt Password=False;Mode=Read;Bind Flags=0;ADSI Flag=-2147483648';
    ADOQuery.SQL.Clear;
    try
      S := 'SELECT AdsPath, CN, SN, SSOguid FROM '''
           + LDAPString + ''' WHERE objectClass=''user'' and CN = ''' + UserId + ''' ';
      ADOQuery.SQL.Add(S);
      ADOQuery.Open;
      ADOQuery.ExecSQL;
      if trim(ADOQuery.FieldByName('SSOguid').AsString) = '' then
        result := false
      else
        result := true;
    except
      on e:Exception do
        if e.ClassType <> EOleException then
          Showmessage(format('[%s] Exception in IsSSOUser: [%s]',[e.ClassType.ClassName, e.Message]));
    end;
  finally
    ADOQuery.Close;
    ADOConnectionSSO.Close;
    ADOQuery.free;
    ADOConnectionSSO.free;
  end;
end;

此代码在 Windows XP 和 Windows Server 2003 上运行良好,但我在 Windows 7 和 Server 2008 上都遇到了访问冲突。我在网上看到了许多关于更改 ADODB 接口如何破坏下游操作系统的线程,但我似乎有相反的问题。我在 Windows 7 机器上构建,代码仅适用于以前版本的 Windows。

4

1 回答 1

5

您将不得不添加

AdoQuery.ParamCheck := false;

在你之前

ADOQuery.SQL.Add(S);

因为您的 LDAPString 可能包含冒号 ( :) 例如。"LDAP://...."这会导致查询尝试为其创建参数对象。此外没有必要ADOQuery.ExecSQLafter ADOQuery.Open

于 2013-02-27T06:31:11.613 回答