从 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 轻松获取用户 ERPAPPUSER
从 laptop123
登录的信息。
我创建了一个数据库登录触发器,可以获取客户端用户名、主机名、登录时间、应用程序名称等,但无法获取客户端操作系统用户名。
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 获取客户端操作系统用户名的主要内容,如果未能解决你的问题,请参考以下文章
我可以从 Microsoft Access 调用 SQL Server 的用户定义函数吗