向服务器查询远程连接的机器名称

向服务器查询远程连接的机器名称

我想找到一条确切的信息,但很难获得:

如何找出远程连接到某个服务器的计算机名称(在 Windows 下)?我尝试使用和 powershell 脚本,但没有成功quserqwinsta

重新追踪 %clientname% 环境变量对我来说不是一个选择,因为在调用它的 java 环境中,它报告的是一个旧值。

谢谢

答案1

我知道这些免费工具可能会有帮助:

TSListUsers

命令行实用程序用于列出本地或远程 Windows 终端服务器/RDP 服务器上当前连接和断开连接的用户、主机名、IP 地址和 RDP 会话号。

要列出用户,您需要具备以下能力:

  • NetBios 访问服务器
  • 允许您查询 RDP 会话信息的权限(如果您可以登录 TS,则默认应该拥有此功能)
  • 目标主机上应运行终端服务/RDP

一个有用但更简单的工具是 帕斯洛格登

帕斯洛格登


对于终端服务器会话,一个有用的工具是免费的 懒惰TS (终端服务管理)用于 PowerShell GUI。


纯 PowerShell 解决方案假定登录用户正在使用 Explorer 桌面 shell(而不是定制外壳)。计算进程实例explorer.exe并找到它们的所有者要容易得多,例如 这个脚本

$explorerprocesses = @(Get-WmiObject -Query "Select * FROM Win32_Process WHERE Name='explorer.exe'" -ErrorAction SilentlyContinue)
if ($explorerprocesses.Count -eq 0)
{
    "No explorer process found / Nobody interactively logged on"
} else {
    foreach ($i in $explorerprocesses)
    {
        $Username = $i.GetOwner().User
        $Domain = $i.GetOwner().Domain
        $Domain + "\" + $Username + " logged on since: " + ($i.ConvertToDateTime($i.CreationDate))
    }
}

更简单 方法 使用该类Win32_LogonSession也可以,但往往会产生比预期更多的结果:

function get-logedonuser {            
param (            
 [string]$computername = $env:COMPUTERNAME            
)            
Get-WmiObject -Class Win32_LogonSession -ComputerName $computername |            
foreach {            
 $data = $_            

 $id = $data.__RELPATH -replace """", "'"            
 $q = "ASSOCIATORS OF {$id} WHERE ResultClass = Win32_Account"            
 Get-WmiObject -ComputerName $computername -Query $q |            
 select @{N="User";E={$($_.Caption)}},             
 @{N="LogonTime";E={$data.ConvertToDateTime($data.StartTime)}}            
}            
}

相关内容