Использование Powershell для остановки службы удаленно без WMI или удаленного доступа
Я столкнулся с этим одним лайнером, который работает:
stop-service -inputobject $(get-service -ComputerName remotePC -Name Spooler)
Может кто-нибудь объяснить, почему, потому что я думал, что стоп-сервис не работает, если вы не использовали удаленный доступ или не произошли на локальном хосте.
Ответы
Ответ 1
Вывод Get-Service
- это класс System.ServiceProcess.ServiceController
.NET, который может работать на удаленных компьютерах. Как это достигается, я не знаю - возможно, DCOM или WMI. После того как вы получили один из них из Get-Service
, его можно передать в Stop-Service
, который, скорее всего, просто вызывает метод Stop()
для этого объекта. Это останавливает службу на удаленной машине. На самом деле вы, вероятно, тоже могли бы это сделать:
(get-service -ComputerName remotePC -Name Spooler).Stop()
Ответ 2
Основываясь на встроенных примерах Powershell, это то, что предлагает Microsoft. Протестировано и проверено:
Чтобы остановить:
(Get-WmiObject Win32_Service -filter "name='IPEventWatcher'" -ComputerName Server01).StopService()
Чтобы начать:
(Get-WmiObject Win32_Service -filter "name='IPEventWatcher'" -ComputerName Server01).StartService()
Ответ 3
Благодаря всем вкладам в этот вопрос, я придумал следующий script. Измените значения для $SvcName
и $SvrName
в соответствии с вашими потребностями. Этот script запустит удаленный сервис, если он остановлен, или остановите его, если он запущен. И он использует классный .WaitForStatus
метод ожидания, пока служба отвечает.
#Change this values to suit your needs:
$SvcName = 'Spooler'
$SvrName = 'remotePC'
#Initialize variables:
[string]$WaitForIt = ""
[string]$Verb = ""
[string]$Result = "FAILED"
$svc = (get-service -computername $SvrName -name $SvcName)
Write-host "$SvcName on $SvrName is $($svc.status)"
Switch ($svc.status) {
'Stopped' {
Write-host "Starting $SvcName..."
$Verb = "start"
$WaitForIt = 'Running'
$svc.Start()}
'Running' {
Write-host "Stopping $SvcName..."
$Verb = "stop"
$WaitForIt = 'Stopped'
$svc.Stop()}
Default {
Write-host "$SvcName is $($svc.status). Taking no action."}
}
if ($WaitForIt -ne "") {
Try { # For some reason, we cannot use -ErrorAction after the next statement:
$svc.WaitForStatus($WaitForIt,'00:02:00')
} Catch {
Write-host "After waiting for 2 minutes, $SvcName failed to $Verb."
}
$svc = (get-service -computername $SvrName -name $SvcName)
if ($svc.status -eq $WaitForIt) {$Result = 'SUCCESS'}
Write-host "$Result`: $SvcName on $SvrName is $($svc.status)"
}
Конечно, для учетной записи, которой вы ее запускаете, понадобятся правильные привилегии для доступа к удаленному компьютеру и запуска и остановки служб. И, выполняя это на старых удаленных компьютерах, вы, возможно, сначала должны установить WinRM 3.0 на более старую машину.
Ответ 4
Это сработало для меня, но я использовал его как начало. выходы PowerShell,
ожидая, что услуга начнется несколько раз, а затем завершается, а затем служба-получатель на удаленном сервере показывает, что служба запущена.
**start**-service -inputobject $(get-service -ComputerName remotePC -Name Spooler)
Ответ 5
Вы также можете сделать (Get-Service -Name "what ever" - ComputerName RemoteHost).Status = "Stopped"
Ответ 6
Другой вариант; используйте invoke-command
:
cls
$cred = Get-Credential
$server = 'MyRemoteComputer'
$service = 'My Service Name'
invoke-command -Credential $cred -ComputerName $server -ScriptBlock {
param(
[Parameter(Mandatory=$True,Position=0)]
[string]$service
)
stop-service $service
} -ArgumentList $service
NB: для использования этой опции вам понадобится PowerShell для установки на удаленном компьютере и для брандмауэра разрешить запросы через и для службы удаленного управления Windows на рабочем компьютере. Вы можете настроить брандмауэр, запустив следующий script непосредственно на целевой машине (одна задача): Enable-PSRemoting -force
.
Ответ 7
stop-service -inputobject $(get-service -ComputerName remotePC -Name Spooler)
Это не удается из-за ваших переменных
-ComputerName remotePC
должна быть переменная $remotePC
или строка "remotePC"
-Name Spooler
(то же самое для буферизации)
Ответ 8
Насколько я знаю, и я не могу проверить его сейчас, вы не можете остановить удаленные службы с помощью командлета Stop-Service или с .Net, он не поддерживается.
Да, он работает, но он останавливает службу на вашем локальном компьютере, а не на удаленном компьютере.
Теперь, если приведенное выше верно, без возможности удаленного доступа или wmi, вы можете установить запланированное задание в удаленной системе, используя AT, который запускает Stop-Service локально.