2016-04-14 146 views
2

要求是每当登录名为Windows身份验证或SQL Server身份验证时,查找哪个操作系统用户登录到SQL Server数据库。需要知道世卫组织(客户端PC上的AD帐户)使用哪个数据库帐户用什么应用程序登录到SQL Server。从SQL Server获取客户端操作系统用户名

的问题是我无法获取客户端的操作系统用户名时。

例如一个SQL Server身份验证用户登录时,我用一台笔记本电脑,laptop123我的AD帐户的域名。域名是Stackoverflow,用户名是developer1,启动Microsoft SQL Server Management Studio,连接DB帐户(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的所有用户将无法登录。

+2

费尔南多,当你登录你没有使用域帐户登录SQL Server和域帐户不会传递到SQL Server。您可以使用任何设备登录。如果您希望在使用可信安全性时将客户端详细信息传递给SQL Server,则必须从前端将其作为参数传递给SQL Server。即使用存储过程或类似的。顺便问一下好问题。并问好。 – cameront

回答

0

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

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

相关问题