Я изо всех сил пытался заставить 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 - Удаленное выполнение процессов Copyright (C) 2001-2010 Марк Руссинович Sysinternals - www.sysinternals.com
Дескриптор недействителен.
Соединение с именем scomservername ... Запуск службы PsExec на scomservername ... Подключение к службе PsExec на scomservername ... Ошибка связи со службой PsExec на scomservername:
Я написал следующую функцию для запуска процесса на удаленном сервере:
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
Возможно, вы можете изменить его, чтобы разрешить альтернативные учетные данные. Надеюсь, это будет полезно.
Вы можете убедиться, что та же самая командная строка отлично работает в cmd.exe. Powershell имеет несколько другие правила разбора аргументов для командной строки.