Измените имя пользователя программно при подключении к Sql Server с использованием аутентификации Windows из приложения Delphi - PullRequest
0 голосов
/ 03 декабря 2009

У меня есть Sql-сервер, который использует аутентификацию Windows.

Я хочу подключиться к серверу из приложения Delphi.

По умолчанию SQL Server принимает учетные данные пользователя, который запускает процесс подключения.

Это означает, что для изменения логина у меня есть две опции:

  1. Выйдите из системы и войдите в систему как вам нужно пользователь, затем запустите мое приложение

  2. Запустите программу из команды строка с помощью команды RUNAS.

Я бы хотел, чтобы пользователь предоставил учетные данные из приложения и вошел в систему как этот пользователь. Возможно ли это, манипулируя ConnectionString или программно изменяя пользователя текущего процесса?

Самое близкое, что я нашел, это эта запись , которая говорит мне, как запустить другой процесс с определенными учетными данными. Я мог бы использовать эту технику для создания программы запуска, которая запускает процесс подключения после сбора учетных данных от пользователя, но мне бы очень хотелось чего-нибудь более чистого.

Я использую Delphi 2010 для этого проекта.

Спасибо

Ответы [ 2 ]

7 голосов
/ 03 декабря 2009

Я думаю, что комбинация LogonUser и затем ImpersonateLoggedOnUser подойдет для вас. Это должно изменить учетную запись пользователя, для которого запущен текущий процесс. Как упоминал gbn, вам, вероятно, придется отключить любое активное соединение, прежде чем изменять учетные данные для входа.

3 голосов
/ 04 декабря 2009

Используя метод, предложенный Скоттом В., этот код работал для меня. Возможно, что-то из этого потребуется настроить в зависимости от конкретной сетевой среды.

procedure ChangeLoggedInUser(username, password, domain: string);
var
  creds: Cardinal;
begin
  try
    if LogonUser(PChar(username)
        ,PChar(domain)
        ,PChar(password)
        ,LOGON32_LOGON_NETWORK
        ,LOGON32_PROVIDER_DEFAULT
        ,creds
      )
    then begin
      ImpersonateLoggedOnUser(creds);
    end
    else begin
      RaiseLastOSError;
    end;
  finally
    //wipe the memory for security
    FillChar(username,SizeOf(username),#0);
    FillChar(password,SizeOf(username),#0);
    FillChar(domain,SizeOf(username),#0);
  end;  //try-finally
end;

Этот код можно назвать так:

...
//at this point i am logged in as whoever is logged into the local machine
DoSomethingMundane;

//change credentials of the current thread
ChangeLoggedInUser('importantuser','secretpassword','mydomain');

//now my process will be logged in as "importantuser"
DoSomethingThatRequiresCreds;

//go back to normal
ReverToSelf;

//now my process is back to normal
DoSomethingMundane;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...