有没有办法使用服务器上的 PowerShell(或其他方法)确定远程桌面客户端的 IP 地址?(我使用的是 Windows Server 2008 R2 x64)
编辑:我发现我可以通过 grep netstat 的标准输出来检索这个非常可行的信息,那么当客户端连接时我怎样才能触发脚本/shell 命令呢?
答案1
您可以从命令提示符运行以下命令来获取连接到 RDP(端口 3389)的远程 IP 列表。
netstat -n | find ":3389" | find "ESTABLISHED"
我确信这可以在 powershell 中编写脚本(或者甚至只是一个普通的批处理文件)。如果您有兴趣,我明天可以提供一个例子。
答案2
好吧,我发现task scheduler
Windows 附带的应用程序是可配置的,我可以在其中运行批处理脚本,当事件日志中生成事件时触发该脚本。通过 UI,您可以选择事件类型、事件源和事件 ID,在这种情况下,我使用了 4264(是的,它捕获了所有登录类型)。在这里我使用了一个简单的批处理脚本:
SET logfile="rdp_ip_logs.log"
date /T>>%logfile%
time /T>>%logfile%
netstat -n | find ":3389" | find "ESTABLISHED">>%logfile%
另外,我还发现了一个关于如何在 .NET 中订阅/监听事件写入的超级有用示例: http://msdn.microsoft.com/en-us/library/bb552514(v=vs.90).aspx 我最终会用它将某些事件写入数据库,以进行基于网络的检查。
该解决方案的唯一缺点是,如果您启用了远程桌面服务并且有多个人连接,则无法在 netstat 输出中区分他们。
答案3
如果不需要编写脚本,您可以在安全事件日志中查找事件 ID 4624。其中会有一行:
源网络地址:192.168.xxx.xxx
答案4
一个非常老问题的新答案
(Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational'; ID=1149; StartTime=(Get-Date).AddDays(-31);} | ForEach-Object {[PSCustomObject] @{User=$_.Properties[0].Value; IPAddress=$_.Properties[2].Value; TimeCreated=$_.TimeCreated;}} | Where-Object User -eq $env:USERNAME | Sort-Object -Property TimeCreated -Descending | Select-Object -First 1).IPAddress