2013-02-27 68 views
3

我有一段用Delphi 2005編寫的代碼,用於在LDAP中搜索用戶的特定屬性。我得到當這是在運行一個訪問衝突是Windows 7或Windows Server 2008,但不能在XP或2003ADODB組件在Win7/Server 2008上導致訪問衝突

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

哪條線引發異常? – jachguate 2013-02-27 04:35:16

+0

ADOQuery.SQL.Add(S);是導致異常的行。當我在Delphi IDE調試器中運行測試應用程序時,它顯示OLEDBParameters.SetParameterInfo(0,nil,nil)上的ADODB.pas中發生的錯誤; – mcmar 2013-02-27 04:45:49

+0

你的代碼亂七八糟!您不必「清除」新創建的「ADOQuery.SQL」。我對你爲什麼要創建一個ADOConnection感到困惑,但同時爲ADOQuery的'ConnectionString'屬性賦值,而不是在同一個ADOQuery上調用'Open'之後討論'ExecSQL'調用,或者如果要指定一個真/假值,而您可以只分配(否定)條件本身。 – jachguate 2013-02-27 07:10:07

回答

5

您將收到您的

ADOQuery.SQL.Add(S); 

添加

AdoQuery.ParamCheck := false; 

因爲你LDAPString可能包含冒號(:)如。 "LDAP://...."這會導致查詢嘗試爲其創建參數對象。此外,在ADOQuery.Open之後不需要ADOQuery.ExecSQL

+0

我提出了你所建議的修改。訪問衝突消失,但隨後在Recordset.Open步驟中有ADOBB.pas中的消息「未指定錯誤」的EOleException。我之前提到的同樣的行爲仍然存在。在XP/2003中工作正常,在Win7/2008中工作正常。 – mcmar 2013-02-27 13:37:50

+0

您是否嘗試使用類似於 的查詢進行連接?SELECT cn,ou,sn FROM'LDAP:// DC = MyDom,DC = MyDomSpace'or SELECT * FROM'LDAP:// DC == MyDom,DC = MyDomSpace' 其中objectClass ='用戶'和CN ='AUsername',以確保不是SSOguid是問題? – bummi 2013-02-27 16:39:09

+0

是的同樣的問題,無論在Select語句中是什麼。 – mcmar 2013-02-28 00:23:37