我使用 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 Environment
子CLIENTNAME
键,如果不存在,则枚举键Volatile Environment
并检查其中任何一个具有全整数值名称(1
,2
等)的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