【问题标题】:Change username programmatically when connecting to a Sql Server using Windows authentication from a Delphi application从 Delphi 应用程序使用 Windows 身份验证连接到 Sql Server 时以编程方式更改用户名
【发布时间】:2009-12-03 18:40:02
【问题描述】:

我有一个使用 Windows 身份验证的 Sql Server。

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

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

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

  1. 注销并根据需要登录 用户,然后运行我的应用程序

  2. 从命令启动程序 行使用 RUNAS 命令。

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

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

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

谢谢

【问题讨论】:

  • 它不使用“用户名”。它使用进程安全凭证。每个正在运行的进程都附加了安全凭证。 ScottW 有正确的答案 - 您必须更改进程/线程安全凭证。

标签: sql-server delphi windows-authentication


【解决方案1】:

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

【讨论】:

  • 可能比我的答案更好。我专注于数据库端,而不是你在代码中所做的事情。
  • 模拟仅适用于当前线程(在这种情况下这是一个优势),如果您需要处理多个用户/连接,您可以在单独的线程中运行它们。
【解决方案2】:

使用 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;

【讨论】:

    猜你喜欢
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 2013-09-07
    相关资源
    最近更新 更多