我有一段用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。
答案 0 :(得分:5)
您必须添加
AdoQuery.ParamCheck := false;
之前
ADOQuery.SQL.Add(S);
因为您的LDAPString可能包含冒号(:
),例如。 "LDAP://...."
导致查询尝试为其创建参数对象。此外,ADOQuery.ExecSQL
之后无需ADOQuery.Open
。