Компонент ADODB вызывает нарушение прав доступа в Win7/Server 2008

У меня есть кусок кода, написанный на 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.

1 ответ

Вам придется добавить

AdoQuery.ParamCheck := false;

до вашего

ADOQuery.SQL.Add(S);

так как ваша строка LDAPS может содержать двоеточие (:) например "LDAP://...." что заставляет запрос попытаться создать объект параметра для него. Кроме того, нет необходимости ADOQuery.ExecSQL после ADOQuery.Open,

Другие вопросы по тегам