AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1065358
Accepted
Grismar
Grismar
Asked: 2021-06-02 12:35:37 +0800 CST2021-06-02 12:35:37 +0800 CST 2021-06-02 12:35:37 +0800 CST

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

  • 772

我使用 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 主机上的同一用户。

windows openvpn rdp
  • 1 1 个回答
  • 526 Views

1 个回答

  • Voted
  1. Best Answer
    Daemon-5
    2021-06-03T01:42:28+08:002021-06-03T01:42:28+08:00

    我会搜索客户端计算机名称。%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 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
    
    • 1

相关问题

  • 知道任何适用于 Windows 的快速可编写脚本的 ftp 客户端吗?[关闭]

  • 如果 Windows 服务崩溃,如何自动重新启动它?

  • 无法安排任务(访问被拒绝)

  • 物理机重启时自动重启虚拟机(VMWare)

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve