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



只要登录是Windows身份验证或SQL Server身份验证,就需要查找哪个操作系统用户登录到SQL Server数据库。需要知道世界卫生组织(客户端PC上的AD帐户)使用哪个数据库帐户使用什么应用程序登录到SQL Server。

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

例如,我在笔记本电脑laptop123上使用了我的AD帐户域名。域名为Stackoverflow,用户名为developer1,启动Microsoft SQL Server Management Studio,连接数据库帐户(SQL Server身份验证)ERPAPPUSER。我需要记录域用户Stackoverflow/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"添加为",否则,对于所有无权访问db_logon_history的用户,将无法登录。

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

长答案:

SQL Server支持2种安全模式。

这些是

  1. "Windows身份验证模式"
  2. "混合模式"-其为";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,则必须将其作为参数从前端传递。即使用存储过程或类似程序。(顺便说一句,问题很好。问得很好。)

最新更新