Windows

在 RDP 連接上查找 VPN 客戶端地址的方法

  • June 10, 2021

我使用 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 主機上始終是同一個使用者。

我會搜尋客戶端電腦名稱。%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

其中***inS-1-5-21-***是使用者 SID。

請注意,還會有一個類似HKEY_USERS\S-1-5-21-***_Classes的不會保存CLIENTNAME子鍵。

可靠地為您獲取客戶端名稱的方法是檢查HKEY_USERS\S-1-5-21-***\Volatile EnvironmentCLIENTNAME鍵,如果它不存在,則列舉其中的鍵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

引用自:https://serverfault.com/questions/1065358