从 RDP 会话中的 SQL CLR 内部获取本地计算机名称或 IP 地址

Getting local computer name or IP address from inside of a SQL CLR in RDP Session

我有一个 C# (.NET 4.5) SQL CLR(SQL Server 2012,Windows Server 2008 R2)。用户通过 RDP 登录到 运行 一个应用程序,该应用程序又调用此 CLR。

我正在尝试从 CLR 内部找出本地计算机名称或本地 IP 地址。

我已经将整个环境转储到 CLR 的日志文件中,并且没有设置 CLIENTNAME 变量(这并不奇怪,因为它可能是 SQL 进程的环境而不是用户的),所以我不能用那个。

我尝试导入 Cassia DLL 并使用它,但是 TerminalServicesManager class 的 ClientIPAddress 为空,所以这似乎也不起作用。

有没有办法从 SQL CLR 获取本地计算机名称或 IP?

尝试一下..希望它会 work

    public string GetIPAddress()
    {
        System.Net.IPHostEntry ipHostInfo = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()); // `Dns.Resolve()` method is deprecated.

        string tempIp = string.Empty;
        foreach (var item in ipHostInfo.AddressList)
        {
            tempIp = item.ToString();
            //Make your comparison here
        }
        return tempIp;
    }

听起来您使用 "local" 来表示客户端(即最终用户;使用远程桌面访问服务器的用户)的 IP 地址。考虑到由于使用 RDP 而从本地机器连接到 SQL 服务器,这绝对是一个需要解决的有趣(且棘手)的问题。如果你 shell 离开 SQL 服务器的进程,无论是通过 xp_cmdshell 还是 SQLCLR,你现在都在一个子进程中,该子进程源自服务器上的进程,而不是客户的机器。客户端的机器和 SQL 服务器之间几乎没有连接。

幸运的是,如果每个用户都使用自己的登录名(Windows 登录名或 SQL 服务器登录名)而不是共享登录名(共享登录名是使用 SQL 服务器登录时更有可能发生)。

如果每个人都有自己的个人登录名,那么您可以执行以下操作:

  1. 创建一个 table 来保存字段,例如:
    • [Login] NVARCHAR(50) NOT NULL
    • ClientName NVARCHAR(50) NOT NULL
    • CreateDate DATETIME NOT NULL CONSTRAINT [DF_TableName_CreateDate] DEFAULT (GETDATE())
  2. 创建一个登录脚本(.cmd 脚本),如果不在他们的 Active Directory 漫游配置文件中(如果您正在使用 AD)。
  3. 登录脚本将简单地调用 SQLCMD 将环境变量 CLIENTNAME 插入 table:

    SQLCMD -Q "INSERT INTO dbo.ClientHostNames (fields) VALUES (ORIGINAL_LOGIN(), N'%CLIENTNAME%');"
    

    之所以有效,是因为在执行命令之前替换了 DOS 变量。

  4. 在您的 SQLCLR 代码中,使用进程内 "Context Connection = true;" ConnectionString 建立连接,因为这将作为登录 运行 SQLCLR 代码执行.
  5. 使用类似于以下的查询获取主机名:

    SELECT HostName
    FROM   dbo.ClientHostNames
    WHERE  WindowsLogin = ORIGINAL_LOGIN()
    ORDER BY CreateDate DESC;
    
  6. 您只需使用 SqlCommand.ExecuteScalar() 即可获得 HostName 值。

这不是最直接的方法,但到目前为止我找不到任何其他有效的方法。我已经尝试设置一个用户环境变量,然后在使用模拟时尝试在 SQLCLR 中获取它,但这似乎不起作用。