从 SQL Server 获取客户端操作系统用户名

Posted

技术标签:

【中文标题】从 SQL Server 获取客户端操作系统用户名【英文标题】:Get client OS username from SQL Server 【发布时间】:2016-08-05 09:38:37 【问题描述】:

要求是在登录是 Windows 身份验证或 SQL Server 身份验证时查找登录到 SQL Server 数据库的操作系统用户。需要知道 WHO(客户端 PC 上的 AD 帐户)使用哪个 db 帐户使用哪个应用程序登录 SQL Server。

问题是当 SQL Server 身份验证用户登录时,我无法获取客户端的操作系统用户名。

例如,我在笔记本电脑上使用了我的AD账号域名,laptop123。域名***,用户名developer1,启动Microsoft SQL Server Management Studio,连接DB账号(SQL Server认证)ERPAPPUSER。我需要记录域用户***/developer1

我可以使用 Microsoft SQL Server Management Studio 轻松获取用户 ERPAPPUSERlaptop123 登录的信息。

我创建了一个数据库登录触发器,可以获取客户端用户名、主机名、登录时间、应用程序名称等,但无法获取客户端操作系统用户名。

CREATE TRIGGER DB_ServerLogon
ON ALL SERVER 
WITH EXECUTE AS 'sa' 
FOR LOGON
AS
BEGIN
    INSERT INTO audit_history.dbo.db_logon_history
       SELECT 
           ORIGINAL_DB_NAME(), 
           ORIGINAL_LOGIN(),
           @@SPID,GETDATE(),
           HOST_NAME(),
           APP_NAME()
END
GO

非常感谢!

-- 添加'WITH EXECUTE AS 'as' ',否则所有无权访问db_logon_history的用户将无法登录。

【问题讨论】:

Fernando,当您使用 SQL Server 登录时,您没有使用域帐户登录,并且域帐户不会传递给 SQL Server。您可以使用任何类型的设备登录。如果您希望在使用受信任的安全性时将客户端详细信息传递给 SQL Server,则必须将其作为参数从前端传递。即使用存储过程或类似的。顺便问下好问题。问得好。 【参考方案1】:

简短的回答是不,这是不可能的。

长答案,SQL Server 支持 2 种安全模式。它们是 a)“Windows 身份验证模式”和 b)“混合模式”——即“SQL Server 和 Windows 身份验证模式”。第二种模式意味着您可以使用 SQL Server 登录名或 Windows 帐户登录。 Windows 帐户将与上述 (a) 中的相同。现在,当您使用 Windows 登录时,它是一个受信任的连接,因此您必须获得 Windows 帐户/组授权才能访问您的 SQL Server 实例。该连接是针对用户登录到 Windows 时创建的令牌的身份验证。此令牌被传递给 SQL Server,因此可以被解析以返回您在上面描述的信息。但是,当您使用 SQL Server 模式登录时,您不会使用域帐户登录,因此不会将域帐户传递给 SQL Server。而是使用在服务器上下文中运行的 SQL Server 本机帐户登录。现在,您可以使用任何类型的设备登录,而不仅仅是 Windows 客户端。如果您希望在使用 SQL Server 模式时将客户端详细信息传递给 SQL Server,则必须将其作为参数从前端传递。即使用存储过程或类似的。 (顺便问下好问题。问得好。)

【讨论】:

以上是关于从 SQL Server 获取客户端操作系统用户名的主要内容,如果未能解决你的问题,请参考以下文章

从 SQL Server 获取访问者 IP 地址

从 SQL Server 2008 数据库获取上次登录时间

我可以从 Microsoft Access 调用 SQL Server 的用户定义函数吗

使用客户端凭据从 Tomcat 连接到 SQL Server

SQL Server锁定的DataReader行为

使用 SQL Server 锁定的 DataReader 行为