使用 powershell 在远程计算机上运行的应用程序列表

使用 powershell 在远程计算机上运行的应用程序列表

我可以访问远程计算机。我甚至可以使用 get-process cmdlet 获取远程计算机中正在运行的进程列表。我无法做的是获取远程计算机上正在运行的应用程序列表。这对于本地计算机来说不是问题,我可以使用以下 cmdlet

get-process | where-object {$_.mainwindowhandle -ne 0} | select-object name, mainwindowtitle

但问题在于远程 PC 会给出空结果。我搜索了很多关于这个主题的内容,发现 mainwindowhandle 在远程机器上不起作用。

因此,如果您能给我提供解决方案,我将不胜感激。

答案1

mainwindowhandle不起作用,因为您用来检查的 powershell 会话实际上没有打开任何“窗口”。您只能看到窗口已经开放,但是不是例如,系统上另一个用户打开的窗口。

尝试以下命令来查看谁实际登录到了远程机器:

quser /server:MyServerName

 USERNAME              SESSIONNAME        ID  STATE   IDLE TIME  LOGON TIME
 you                   rdp-tcp#88          1  Active          .  8/14/2020 11:41 AM
 user2                                     2  Disc            .  8/14/2020 10:00 AM

然后获取SessionID具体属于该用户的进程:

Get-WmiObject win32_Process -ComputerName MyServerName -Property Name,SessionID | 
  Where SessionID -EQ 1 | 
  Select Name,SessionID

Name              SessionID
----              ---------
explorer.exe              1
powershell.exe            1
notepad.exe               1
[etc.]

这将返回的不仅仅是打开的窗口,但无法分辨哪些进程打开了窗口,因为 Windows 在会话之间隔离了这些信息(运行远程桌面服务器/RDS 主机时除外)。

当您进行远程检查时,Windows 会创建一个新的小型会话,其中只有一个(隐藏)窗口,标题为“WSMan Provider Host”。您可以使用User32编写的代码了解更多信息这里来自 reddit 用户 u/LandOfTheLostPass

相关内容