获取终端服务器上的进程的客户端ComputerName

时间:2017-04-17 12:03:27

标签: windows powershell powershell-v2.0

我正在运行一个脚本来收集在终端服务器上运行应用程序的信息。我想获得运行应用程序的用户的远程ComputerName,但我只能获得终端服务器的ComputerName。关于如何实现这一点的任何想法?这是我收集信息的脚本部分。

Get-WmiObject Win32_Process -ComputerName MYTSSERVER | Where-Object {
  $_.mainwindowhandle -ne 0 -and
  $_.Name -eq "WINWORD.exe"
} | Select-Object CSName, ProcessName

1 个答案:

答案 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