![获取 RDP 客户端计算机的主机名](https://linux22.com/image/1305847/%E8%8E%B7%E5%8F%96%20RDP%20%E5%AE%A2%E6%88%B7%E7%AB%AF%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9A%84%E4%B8%BB%E6%9C%BA%E5%90%8D.png)
我有一个问题,我确信它有一个简单的解决方案,但我一直无法解决。
图片中有一个服务器,有几个人在使用。
他们都使用同一个账户登录。
区分会话的唯一方法是通过主机名或 IP。
那么 - 如何在远程计算机上查看已连接客户端的主机名?
例如,我256.12.13.1
从我的 IP 通过RDP 进入服务器256.12.13.7
。
我是否可以在该远程会话中在服务器上运行并输出命令256.12.13.7
?
256.12.13.9
我问这个问题是因为如果当人们从另一个 IP 连接时该命令能够输出就好了。
所以我可以把它放在启动时,每当有人连接时,就会运行这样的脚本:
gethostname >> rdplog.txt<br>
date /t >> rdplog.txt <br>
time /t >> rdplog.txt
所以这基本上可以等同于一个非常简单的登录日志。
答案1
您可以编写如下批处理脚本:
netstat -na | find "3389" | find "ESTABLISHED" >> C:\path_to_rdplog.txt
date /T >> C:\path_to_rdplog.txt
time /T >> C:\path_to_rdplog.txt
echo. >> C:\path_to_rdplog.txt
echo ----------- >> C:\path_to_rdplog.txt
echo. >> C:\path_to_rdplog.txt
您只需确保登录的人对 C:\path_to_rdplog.txt 具有写入权限
答案2
无论如何,这是一个非常古老的话题。我们曾经检查过在 RDP 会话中设置的环境变量 CLIENTNAME。我们有一个较旧的应用程序,无法轻松使用 Windows API 或 Powershell,并检查了这个环境变量。此变量保存建立 RDP 连接的客户端计算机的主机名。
答案3
Microsoft MVP Shay Levy 做了PSTerminalServices
具有终端服务 cmdlet 的 PowerShell 模块。
它需要安装,默认情况下它不存在。
我还没有用过它,刚刚发现它。
答案4
Powershell 对一个相当老的问题做出的新解答
(Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational';ID=1149;StartTime=(Get-Date).AddDays(-31);} | ForEach-Object {[PSCustomObject] @{User=$_.Properties[0].Value;ClientName=$_.Properties[1].Value;IPAddress=$_.Properties[2].Value; TimeCreated=$_.TimeCreated;}} | Where-Object User -eq $env:USERNAME | Sort-Object -Property TimeCreated -Descending | Select-Object -First 1).ClientName
该代码片段抓取了过去 31 天内终端服务事件日志中的所有事件,并使用用户名、客户端名称、IP 地址和登录条目的时间戳构建自定义对象。然后,它使用当前用户的名称过滤自定义对象,然后按登录日期的降序对自定义对象进行排序,最后抓取最顶部的(即最新的事件日志条目),并从自定义对象中提取客户端名称。我实际上是在逐行浏览代码并按顺序解释每一段代码 - 代码实际上并没有太多内容。
值得注意的是,事件日志记录了成功的 RDP 连接,其中包含我们感兴趣的数据。解析、过滤、排序和提取相关数据以将其转化为有用的信息才是游戏的名称!