如何获取已连接的Windows RDP用户的IP或主机名?

时间:2012-04-20 16:59:20

标签: session wmi rdp wsh

我有一个vbs脚本,用于监控远程登录服务器的用户 它使用“qwinsta”来获取用户名,我可以简单地循环等待断开连接。

但qwinsta不会返回远程用户的主机名或IP地址。我整个上午都搜索过,找不到任何cmd命令或wmi命令来根据用户名或会话ID获取连接用户的IP /主机。

有没有人有任何其他想法来获取此信息?我发现这个外部实用程序提供了ip地址:http://home.fnal.gov/~jklemenc/tslistusers.html但我宁愿不使用外部程序。我假设它正在使用一些wmi或其他方法来获取我在自己的脚本中可以做的ipaddress。

我知道我可以使用netstat和过滤器端口3389来获取RDP会话并以此方式获取IP,但我无法知道哪个IP属于哪个用户。

2 个答案:

答案 0 :(得分:1)

此信息通过(大多数)未记录的API WinStationQueryInformationW公开。据我所知,它不是通过WMI或任何命令行实用程序或COM对象公开的。

如果您可以使用.NET语言,则可以使用Cassia library来处理Win32 API调用 - 请参阅ITerminalServicesSession.RemoteEndPoint(以guest身份登录时下载最新的trunk版本here )。应该可以使用VBScript using tlbexp and regasm中的Cassia,但我还没有尝试过。

答案 1 :(得分:1)

您可以在批处理文件中使用以下代码将主机名的文本文件传递到数组中,并查询每个代码以获取rdp会话信息... (只需确保Server_List.txt文件位于您创建的批处理文件旁边)

@echo off
setlocal EnableDelayedExpansion
echo RDPSessionINFO > ./results.txt
echo ============== >> ./results.txt

set i=0
for /F %%a in (Server_List.txt) do (
   set /A i+=1
   set array[!i!]=%%a
)
set n=%i%

for /L %%i in (1,1,%n%) do echo !array[%%i]! >> ./results.txt && qwinsta /server:!array[%%i]!>> ./results.txt && echo =================== >> ./results.txt

start notepad.exe ./results.txt