我正在运行一个脚本来收集在终端服务器上运行应用程序的信息。我想获得运行应用程序的用户的远程ComputerName,但我只能获得终端服务器的ComputerName。关于如何实现这一点的任何想法?这是我收集信息的脚本部分。
Get-WmiObject Win32_Process -ComputerName MYTSSERVER | Where-Object {
$_.mainwindowhandle -ne 0 -and
$_.Name -eq "WINWORD.exe"
} | Select-Object CSName, ProcessName
答案 0 :(得分:0)
您无法从Word进程获取客户端主机名或IP地址,因为该进程在远程桌面服务器上本地运行。远程桌面登录信息记录在事件日志中,因此您需要从那里提取它。但是,您需要远程用户名来查找正确的登录会话,因此您仍需要首先运行WMI查询。
在远程桌面服务器上运行的单个Word进程的示例:
$server = '...'
$p = Get-WmiObject Win32_Process -Computer $server -Filter "Name='WINWORD.exe'"
$u = $p.GetOwner().User
$fltr = "*logon type:`t`t`t10*new logon:*account name:`t`t$u"
$addr = Get-EventLog -Computer $server -LogName Security -InstanceId 4624 -Message $fltr -Newest 1 |
Where-Object { $_.Message -match 'source network address:\s*(.*)' } |
ForEach-Object { $matches[1] }
事件日志查询的过滤器与启动Word进程(account name:`t`t$u
)的用户的最新远程桌面登录(事件ID 4626,登录类型10)匹配。
但这只会给你客户的IP地址。如果您需要主机名,则需要通过反向DNS查找解析主机名,或者使用其他WMI查询从主机本身获取主机名:
$hostname = Get-WmiObject Win32_OperatingSystem -Computer $addr |
Select-Object -Expand CSName