我有一个服务器,它有几个任务关键脚本,作为登录用户在CMD.exe窗口中运行。我需要能够单独远程任意一个脚本。
如果我是本地人我可以跑
Get-Process | Where-Object {
$_.Name -eq "cmd"
} | ft name, MainWindowTitle
这至少会让我描述一下CMD.exe
正在做什么。
但是,如果我使用任何方法远程运行(PSSession或CIMSession),将不会返回MainWindowTitle。它总是空白的。
任何人都可以建议任何其他方法来找出通过PowerShell远程运行的脚本。
查询进程的命令行是最佳选择,因为在远程处理期间,与MainWindowTitle
等GUI相关的属性基本上不可用。
但是,命令行是否允许您识别正在运行的脚本(批处理文件)取决于该脚本最初的启动方式:
"C:\WINDOWS\system32\cmd.exe"
作为命令行,而不是脚本的路径。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
Get-CimInstance -ComputerName . -ClassName Win32_Process -Filter "Name = 'cmd.exe'" -Property Name,CommandLine | ft Name,CommandLine
$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}