如何获取用户SQL日志的Windows登录用户名

时间:2009-03-15 17:14:07

标签: sql sql-server windows sql-server-2005

通过使用sp_who2,我可以获得当前登录用户和计算机名称的列表。有些用户正在使用SQL Server登录用户名,例如sa。有没有什么方法可以获得SQL登录用户的Windows登录用户名?

如果无法从计算机名称获取Windows登录用户,是否可以使用WMI类或C#通过其计算机名称查找Windows登录用户名?

我的SQL服务器是Microsoft SQL Server 2005,Windows是Server 2003。

6 个答案:

答案 0 :(得分:20)

要获取用户和计算机名称,请使用以下命令:

SELECT HOST_NAME() AS HostName, SUSER_NAME() LoggedInUser

答案 1 :(得分:2)

SQL登录名和NT用户名之间没有链接。

你在这里问了类似的问题:How to find out user name and machine name to access to SQL server

如果超过1个用户登录到客户端PC(例如服务帐户,远程用户通过mstsc等),则WMI方法将是不明确的。对于所使用的帐户,任何此类方法都需要客户端PC上的管理员权限。

我怀疑你能不能实时做到这一点。

您所能做的只是在client_net_address中记录sys.dm_exec_connections并从那里回溯,可能是通过WMI而不是从SQL Server本身。

你需要用户名吗?或者只是客户端PC,以便您可以更改应用程序连接字符串?

您最终的解决方案是更改sa密码并查看谁调用,如果您只有相对较少的SQL连接

答案 2 :(得分:1)

  1. 您可以通过查询会话获取客户端IP地址和远程PID。连接。
  2. 使用此信息构建TASKLIST命令。
  3. 使用XP_CMDShell执行内置命令以获取用户。

    DECLARE @CMD VARCHAR(500) = 
    (SELECT  TOP 1 'tasklist /S ' + client_net_address + 
    ' /FI "PID eq ' + CONVERT(VARCHAR(MAX),host_process_id) + 
    '" /V /FO LIST /U DOMAIN\Admin /P password' 
    FROM sys.dm_exec_connections C JOIN sys.dm_exec_sessions S
    ON C.session_id = S.session_id WHERE S.session_id = @@SPID)
    EXEC xp_cmdshell @CMD

  4. 您可以随意使用它。要么通过在ALL SERVER触发器中使用它来发送邮件给DBA,要么用于Ad-Hoc审计。 希望这有助于=)

答案 3 :(得分:0)

我不知道是否有办法完全按照你的要求去做。但是,我过去所做的是使用sql profiler并在结果列中包含“主机名”。我工作的机器名称恰好是唯一的,可以追溯到用户。如果您的机器名称也是唯一的,这可能会得到您需要的结果。您可以过滤登录名= sa以缩小结果范围。

答案 4 :(得分:0)

我在黑暗中拍摄但也许我的想法会帮助你找到答案。据我所知,没有直接的方法来解决这个问题。哪个恕我直言是一件好事。现在有几个想法:

如果这是一个自定义应用程序,您可以将该信息作为应用程序名称包含在连接字符串中。如果这是一个服务器应用程序并且您正在使用模拟,那么如果执行此操作,您将失去池连接的能力。在客户端应用程序上,这应该不是问题。

您的客户在任何给定时间只有一位登录用户吗?例如桌面应用程序?您可以使用WMI as such。如果这又是一台服务器,并且您想知道在其下运行的安全上下文可能仍然能够获取此信息。否则你至少可以弄清楚是谁发起了这个过程。

SQL事件探查器知道客户端进程的PID。但我无法找到它存储在SQL中的位置。如果您可以找到如何获取PID(您可以以编程方式运行跟踪并将登录事件存储到表中)。您可以使用this script启动启动用户。

答案 5 :(得分:0)

行。我试图使用WMI类来获取远程计算机的信息(WMI class \ fullmancinename \ roor \ cimc2,以及来自Win32_ComputerSystem的对象查询select *)。它适用于我的本地计算机,但具有远程计算机名称,您需要传递具有足够安全权限的用户名和密码才能访问或读取。处理从远程计算机获取用户名是另一个Windows安全问题。

我的尝试代码基于参考C# Read Windows Logon User Name in WMI