D2010 ado sql windows авторизация + пароль

andreymx
Дата: 19.12.2019 08:11:16
Коллеги, подскажите

Прога запускается из под одной учётной записи
Надо через Адо законнектиться к скл-серверу через другую ад-шную учетку
Имя и пароль есть

В шарпе делал как-то
Tactical Nuclear Penguin
Дата: 19.12.2019 08:19:28
andreymx
Коллеги, подскажите

Прога запускается из под одной учётной записи
Надо через Адо законнектиться к скл-серверу через другую ад-шную учетку
Имя и пароль есть

В шарпе делал как-то


может это поможет?
andreymx
Дата: 19.12.2019 08:44:06
Tactical Nuclear Penguin,

Спасибо, посмотрю
Вот пример, пусть подлежит
http://delphimaster.net/view/4-56971
andreymx
Дата: 19.12.2019 14:41:31
попробовал такой пример

пока не очень
var SI:_STARTUPINFOA;
PI:_PROCESS_INFORMATION;
UserName,Domain,Password,AppName: PChar;
PH: Cardinal;
PT: PHandle;
begin
  SI.cb:=sizeof(_STARTUPINFOA);
  SI.lpReserved:=nil;
  SI.lpDesktop:=nil;
  SI.lpTitle:=nil;
  SI.cbReserved2:=0;
  UserName:='Новое Имя';
  Domain:='домен';
  Password:='Новый пароль';

  if LogonUser(UserName,Domain,Password,LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,PH) then
  begin
    if ImpersonateLoggedOnUser(PH) then ShowMessage ('ImpersonateLoggedOnUser done')
    else ShowMessage('ImpersonateLoggedOnUser Error');
  end;



  ShowMessage(GetActiveUserName); // это моя функция выдает текущего юзера - выдаёт 'Новое Имя'
  ADOConnection1.Connected := true;
  // sqltext = 'select CURRENT_USER, SYSTEM_USER' - выдаёт то имя, с которым запущено программа
  ADOQuery1.Open;

end;
_Vasilisk_
Дата: 19.12.2019 15:38:06
+
type
  PLogonUserThreadInfo = ^TLogonUserThreadInfo;
  TLogonUserThreadInfo = record
    Token: THandle;
    Handle: THandle;
  end;

function LogonUserThread(const AUserName, ADomain, APassword: string;
  ALogonType: Cardinal; AThreadHandle: THandle): Pointer;
var
  LLogonInfo: PLogonUserThreadInfo absolute Result;
  LLogonToken: THandle;
  LImpersonateToken: THandle;
begin
  GetMem(LLogonInfo, SizeOf(LLogonInfo^));
  try
    LLogonInfo^.Token := 0;
    if not OpenThreadToken(AThreadHandle, TOKEN_IMPERSONATE, True, LLogonInfo^.Token) and
       (GetLastError <> ERROR_NO_TOKEN)
    then
      RaiseLastOSError;
    try
      Win32Check(LogonUser(PChar(AUserName), PChar(ADomain), PChar(APassword),
        ALogonType, LOGON32_PROVIDER_DEFAULT, LLogonToken));
      try
        Win32Check(DuplicateToken(LLogonToken, SecurityImpersonation, @LImpersonateToken));
        try
          Win32Check(SetThreadToken(@AThreadHandle, LImpersonateToken));
        finally
          CloseHandle(LImpersonateToken);
        end;
      finally
        CloseHandle(LLogonToken);
      end;
    except
      CloseHandle(LLogonInfo^.Token);
      raise;
    end;
    LLogonInfo^.Handle := AThreadHandle;
  except
    if LLogonInfo^.Token <> 0 then
      CloseHandle(LLogonInfo^.Token);
    FreeMem(LLogonInfo);
    raise;
  end;
end;

procedure LogoffUserThread(AData: Pointer);
var
  LLogonInfo: PLogonUserThreadInfo absolute AData;
begin
  try
    Win32Check(SetThreadToken(@LLogonInfo^.Handle, LLogonInfo^.Token));
  finally
    if LLogonInfo^.Token <> 0 then
      CloseHandle(LLogonInfo^.Token);
    FreeMem(LLogonInfo);
  end;
end;
использование
var
  LPtr: Pointer;
begin
  LPtr := LogonUserThread('user', '', 'password', GetCurrentThread);
  try
    ........
  finally
    LogoffUserThread(LPtr);
  end;
end;
andreymx
Дата: 19.12.2019 16:21:28
_Vasilisk_,

спасибо большое
на первый взгляд работает
только добавил LOGON32_LOGON_INTERACTIVE

LPtr := LogonUserThread(UserName, Domain, password, LOGON32_LOGON_INTERACTIVE, GetCurrentThread);
_Vasilisk_
Дата: 19.12.2019 16:37:28
andreymx
только добавил LOGON32_LOGON_INTERACTIVE
Ну да. Это забыл