如何找出远程计算机上正在运行的CMD.exe进程的脚本?

时间:2018-10-17 18:49:43

标签: powershell batch-file cmd

我有一台服务器,该服务器具有几个作为登录用户在CMD.exe窗口中运行的关键任务脚本。 我需要能够分别远程控制其中任何一个脚本。

如果我是本地人,我可以运行

Get-Process | Where-Object {
    $_.Name -eq "cmd"
} | ft name, MainWindowTitle

这至少将为我提供CMD.exe正在做什么的描述。

但是,如果我使用任何方法(PSSession或CIMSession)远程运行此方法,则不会返回MainWindowTitle。它将始终为空白。

任何人都可以建议其他方法来找出正在通过PowerShell远程运行什么脚本的情况。

3 个答案:

答案 0 :(得分:3)

补充Nas' helpful solution

查询进程的命令行是您的最佳选择,因为与 GUI相关的属性(例如MainWindowTitle)在远程处理过程中根本不可用 strong>。

但是,命令行是否允许您识别正在运行的脚本(批处理文件)取决于该脚本最初的启动方式

  • 如果脚本是从首先​​单独打开的交互式控制台窗口启动的,则您只会看到"C:\WINDOWS\system32\cmd.exe"作为命令行,而不是脚本的路径。

  • 如果脚本是通过文件资源管理器或其他GUI方法启动的,或者通过API调用启动的,则在命令行中查看脚本文件路径,例如,
    C:\WINDOWS\system32\cmd.exe /c ""C:\Users\jdoe\someScript.cmd" "

    • 但是,即使启动脚本稍后再调用另一个脚本,也不一定是当前正在运行的脚本。

相反,如果您的脚本启动执行实际工作的外部可执行文件 ,则最好的选择是直接查询此类可执行程序 ;例如,如果您的脚本启动foo.exe,请使用:

(Get-CimInstance -ComputerName $comp -ClassName Win32_Process -Filter "Name = 'foo.exe'").CommandLine

答案 1 :(得分:0)

Get-CimInstance -ComputerName . -ClassName Win32_Process -Filter "Name = 'cmd.exe'" -Property Name,CommandLine | ft Name,CommandLine

答案 2 :(得分:0)

$Ses = New-CimSession -ComputerName $Computer -Credential $Cred
$Process = Get-CimInstance CIM_Process -CimSession $Ses | Where-Object{ $ProcessNames -contains $_.Name }

FOREACH ($Proc IN $Process) {Invoke-CimMethod -InputObject $Proc -MethodName Terminate}