我一直在努力让 powershell 运行 Psexec。它对于单行命令来说运行良好。但我需要调用 SCOM 以通过 Psexec 将服务器置于维护模式...
$output = .\pstools\PsExec.exe \\scomserver-u $user -p $password -w c:\scom -h "c:\scom\agentmm.exe servertoputinmaintenancemode 4 Automated Maintenance Mode Now +45m"
我尝试在每句话后加上引号,但没有用。我收到此错误
PsExec v1.98 - 远程执行进程版权所有 (C) 2001-2010 Mark Russinovich Sysinternals - www.sysinternals.com
句柄无效。
正在连接到 scomservername...正在启动 scomservername 上的 PsExec 服务...正在连接 scomservername 上的 PsExec 服务...与 scomservername 上的 PsExec 服务通信时出错:
答案1
我编写了以下函数来在远程服务器上启动一个进程:
Function StartRemote {
param([string] $computer = $(Read-Host "Computername"),
[string] $cmd = $(Read-Host "Commandline"))
$remoteProcess = "" | Select-Object ProcessID, ComputerName, `
ReturnValue, ReturnMsg, Cmd
$remoteProcess.ComputerName = $computer
$remoteProcess.Cmd = $cmd
$mc = New-Object System.Management.ManagementClass `
"\\$computer\root\cimv2:Win32_Process"
$result = $mc.create($cmd)
$remoteProcess.ReturnValue = [int]$result.ReturnValue
$remoteProcess.ProcessID = $result.ProcessId
switch($remoteProcess.ReturnValue) {
0 { $remoteProcess.ReturnMsg = "OK" }
2 { $remoteProcess.ReturnMsg = "Access denied" }
3 { $remoteProcess.ReturnMsg = "Insufficient privilege" }
8 { $remoteProcess.ReturnMsg = "Unknown failure" }
9 { $remoteProcess.ReturnMsg = "Path not found" }
21 { $remoteProcess.ReturnMsg = "Invalid parameter" }
}
return $remoteProcess
}
它需要计算机名称和命令行作为字符串,确保转义额外的引号,并返回一个包含有关您的进程的信息的自定义对象:
PoSH> StartRemote -computer TEST-VM -cmd "gpupdate /force"
ProcessID : 6992
ComputerName : TEST-VM
ReturnValue : 0
ReturnMsg : OK
Cmd : gpupdate /force
也许您可以修改它以允许其他凭据。希望这对您有所帮助。
答案2
您可能希望确保相同的命令行在 cmd.exe 中正常工作。Powershell 对命令行的参数解析规则略有不同。