从Delphi应用程序使用Windows身份验证连接到SQL Server时以编程方式更改用户名

yhxst69z  于 2022-09-21  发布在  Windows
关注(0)|答案(2)|浏览(129)

我有一台使用Windows身份验证的SQL Server。

我想从Delphi应用程序连接到服务器。

默认情况下,SQL Server将采用启动连接进程的用户的凭据。

这意味着要更改登录,我目前有两个选择:

1.注销并以所需用户身份登录,然后运行我的应用程序
1.使用RunAs命令从命令行启动程序。

我想让用户从应用程序中提供凭据,并以该用户身份登录。是否可以通过操作ConnectionString或以编程方式更改当前进程的用户?

我找到的最接近的是this entry,它告诉我如何在特定凭据下启动另一个进程。我可以使用这种技术来创建一个“启动器”程序,该程序在从用户那里收集凭据后启动连接过程,但我真的想要更干净的程序。

我在这个项目中使用了Delphi 2010。

谢谢

zqry0prt

zqry0prt1#

我认为LogonUserImpersonateLoggedOnUser的组合会对您起作用。这应该会更改当前进程正在运行的用户帐户。正如GBN提到的,在更改登录凭据之前,您可能必须断开所有活动连接。

13z8s7eq

13z8s7eq2#

使用Scott W建议的方法,这段代码对我有效。其中一些可能需要根据您的特定网络环境进行调整。

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
RevertToSelf;

//now my process is back to normal
DoSomethingMundane;

相关问题