在 RDP 连接上查找 ​​VPN 客户端地址的方法

在 RDP 连接上查找 ​​VPN 客户端地址的方法

我使用 PowerShell 检测某人当前是否通过 RDP 连接:

Get-WinEvent Microsoft-Windows-TerminalServices-LocalSessionManager/Operational | Where-Object {$_.Id -eq 24 -or $_.Id -eq 25} | Select-Object -First 1 -Property *

这样,我就可以获取 IP。获取相同信息的另一种方法是:

netstat -n | findstr ":3389" | findstr "ESTABLISHED"

但是,在我的网络上,大多数通过 RDP 登录的用户将通过 OpenVPN 连接,因此他们的会话的 IP 始终是 OpenVPN 服务器的 IP。

现在,显然 RDP 主机能够与原始 RDP 客户端通信。我如何才能找到有关该 RDP 客户端身份的任何信息?(IP、主机名、netbios 名称,任何可以帮助我识别机器或用户的信息)

我也无法使用用于登录远程桌面的帐户,因为在我感兴趣的特定情况下,人们共享相同的登录会话,因此 RDP 主机上始终是同一个用户。

答案1

我将搜索客户端计算机名称。%CLIENTNAME%环境变量保留此值。

在主机上的用户会话中,它可以从命令行或脚本中使用:

echo %CLIENTNAME%

但是,请注意,在有多个用户共享同一会话并使用共享用户帐户的系统上,此值可能会过时。

获取主机上当前登录会话的更可靠方法是从注册表中获取值。根据所用 Windows 版本,它将位于以下位置之一:

示例 1(NT 5.2):

[HKEY_USERS\S-1-5-21-***\Volatile Environment]
"CLIENTNAME"="DESKTOP-223XGQ"

示例 2 (NT 6.3):

[HKEY_USERS\S-1-5-21-***\Volatile Environment\3]
"CLIENTNAME"="DESKTOP-223XGQ"

从用户环境运行的示例 3(NT 6.1)批处理脚本:

for /f "tokens=3*" %%i in ('reg query "hkcu\Volatile Environment" /s /v CLIENTNAME^|find/i"CLIENTNAME"') do @echo %%i

其中***S-1-5-21-***用户 SID。

请注意,还会有一个类似的HKEY_USERS\S-1-5-21-***_Classes,但它不会保存CLIENTNAME子项。

可靠地获取客户端名称的方法是检查HKEY_USERS\S-1-5-21-***\Volatile EnvironmentCLIENTNAME键,如果不存在,则枚举键Volatile Environment并检查其中任何一个具有全整数值名称(12等)的CLIENTNAME子键。

执行此操作的 Python 函数:

def get_client_name():
    with ConnectRegistry(None, HKEY_USERS) as root:
        try:
            n = 0
            while True:
                user_key = EnumKey(root, n)
                if user_key.startswith('S-1-5-21-') and not user_key.endswith('_Classes'):
                    with OpenKey(root, f"{user_key}\Volatile Environment", 0, KEY_READ) as ve_key:
                        try:
                            return QueryValueEx(ve_key, 'CLIENTNAME')[0]
                        except FileNotFoundError:
                            pass
                        try:
                            m = 0
                            while True:
                                client = EnumKey(ve_key, m)
                                try:
                                    with OpenKey(ve_key, f'{client}', 0, KEY_READ) as client_key:
                                        return QueryValueEx(client_key, 'CLIENTNAME')[0]
                                except (OSError, FileNotFoundError):
                                    pass
                                m += 1
                        except OSError:
                            pass
                n += 1
        except OSError:
            return None

并且所有这些方法都适用于Windows终端服务器和Citrix服务器(在Receiver 4.12上检查)。

另一种方法是安装 PowerShell cmdlet 并使用它来捕获信息:

Install-Module -Name PSTerminalServices
Get-TSSession

或者具体来说

Get-TSSession | ft ClientName

相关内容