我有一个使用Windows身份验证的Sql Server。
我想从Delphi应用程序连接到服务器。
默认情况下,SQL Server将采用启动连接过程的用户凭据。
这意味着要更改登录,我目前有两个选项:
注销并按需要登录 用户,然后运行我的应用程序
从命令启动程序 使用RUNAS命令行。
我想让用户从应用程序中提供凭据,并以该用户身份登录。这可能是通过操作ConnectionString还是以编程方式更改当前进程的用户来实现的吗?
我找到的最近的是this entry,它告诉我如何在特定凭据下启动另一个进程。我可以使用该技术创建一个“启动器”程序,在从用户收集凭据后启动连接过程,但我真的想要更清洁。
我正在将Delphi 2010用于此项目。
由于
答案 0 :(得分:7)
我认为LogonUser
和ImpersonateLoggedOnUser
的组合将为您提供帮助。这应该更改当前进程正在运行的用户帐户。正如gbn所提到的,在更改登录凭据之前,您可能必须断开所有活动连接。
答案 1 :(得分:3)
使用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
ReverToSelf;
//now my process is back to normal
DoSomethingMundane;