我想找到一条确切的信息,但很难获得:
如何找出远程连接到某个服务器的计算机名称(在 Windows 下)?我尝试使用和 powershell 脚本,但没有成功quser
。qwinsta
重新追踪 %clientname% 环境变量对我来说不是一个选择,因为在调用它的 java 环境中,它报告的是一个旧值。
谢谢
答案1
我知道这些免费工具可能会有帮助:
命令行实用程序用于列出本地或远程 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)}}
}
}