gpt4 book ai didi

c# - 从 RDP session 中的 SQL CLR 内部获取本地计算机名称或 IP 地址

转载 作者:行者123 更新时间:2023-11-30 17:40:56 25 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

听起来您使用“本地”来表示客户端(即最终用户;使用远程桌面访问服务器的用户)的 IP 地址。考虑到由于使用 RDP 而从本地计算机建立与 SQL Server 的连接,这绝对是一个需要解决的有趣(且棘手)的问题。如果您通过 xp_cmdshell 或 SQLCLR 退出 SQL Server 的进程,您现在处于一个子进程中,该子进程源自服务器上的进程,而不是客户端计算机上的进程。客户端机器和 SQL Server 之间几乎没有连接。

幸运的是,如果每个用户都使用自己的登录名(Windows 登录名或 SQL Server 登录名)而不是共享登录名(使用 SQL Server 登录名时更有可能发生共享登录名),则有一种方法可以获取此信息.

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

  1. 创建一个表来保存字段,例如:
    • [登录] NVARCHAR(50) NOT NULL
    • ClientName NVARCHAR(50) NOT NULL
    • CreateDate DATETIME NOT NULL
      CONSTRAINT [DF_TableName_CreateDate] 默认 (GETDATE())
  2. 创建一个登录脚本(.cmd 脚本),如果不在他们的 Active Directory 漫游配置文件中(如果您使用 AD),至少在该服务器上与他们的配置文件相关联。
  3. 登录脚本将简单地调用 SQLCMD 将环境变量 CLIENTNAME 插入到表中:

    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 中获取它,但这似乎不起作用。

关于c# - 从 RDP session 中的 SQL CLR 内部获取本地计算机名称或 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33749930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com