Назад | Перейти на главную страницу

PSEXEC от PowerShell

Я изо всех сил пытался заставить 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 имеет несколько другие правила разбора аргументов для командной строки.