2012-04-26 2 views
21

Я наткнулся на это один лайнер, который появляется на работу:Использование Powershell, чтобы остановить службу удаленно без WMI или Remoting

stop-service -inputobject $(get-service -ComputerName remotePC -Name Spooler) 

Может кто-нибудь объяснить, почему, потому что я думал, что стоп-сервис не работал, если вы либо используемый удаленный доступ или он произошел на локальном хосте.

ответ

30

Выход Get-Service - это класс System.ServiceProcess.ServiceController .NET, который может работать на удаленных компьютерах. Как это достигается, я не знаю - возможно, DCOM или WMI. Как только вы получили один из них из Get-Service, его можно передать в Stop-Service, который, скорее всего, просто называет метод Stop() на этом объекте. Это останавливает службу на удаленной машине. На самом деле, вы, вероятно, может сделать это, а также:

(get-service -ComputerName remotePC -Name Spooler).Stop() 
+5

Примечание. Протестирован этот метод, и он выполняет вызов удаленного хоста, но не дожидался прекращения службы перед продолжением сценария. Если вы сделаете Stop() и Start(), Start() скорее всего потерпит неудачу, потому что Служба еще не остановлена. Просто FYI, если вы хотите сделать больше, чем Stop в своем скрипте (что выходит за рамки того, что задал этот вопрос) –

+0

Просто вопрос с полномочиями, я думаю: возможно ли это сделать из командного файла, например, поместить несколько строк для нескольких машин после друг друга (например .bat) – Hace

+0

В новых версиях (3+?) Powershell вы можете получить эту услугу, а затем использовать ее метод '' .WaitForStatus' (http://www.powershellmagazine.com/2013/04/10/pstip-wait-for-a-service-to-reach-a-defined-status /) – Baodad

-5

Насколько я знаю, и я не могу проверить это сейчас, вы не можете остановить удаленные службы с помощью командлета Stop-Service или с .Net, это не поддерживается.

Да, это работает, но оно останавливает обслуживание на вашем локальном компьютере, а не на удаленном компьютере.

Теперь, если это правильно, без использования удаленного доступа или wmi, вы можете установить запланированное задание в удаленной системе, используя AT, который запускает Stop-Service локально.

+1

Я проверил, что он работает и не останавливает службу на локальной машине. Я удивлен, что это не широко известно/использовано. – fenster

+0

Я забираю его обратно. оно работает! Я не знал, что вы можете это сделать: –

0

Вы также можете сделать (Get-Service -Name "what ever" - ComputerName RemoteHost).Status = "Stopped"

+2

Хмм забыть об этом. Если вы снова получаете услугу, она все еще находится в том же состоянии. Я назначил это переменной и, таким образом, назначил работу атрибута status, но фактически не останавливает службу на удаленном хосте. Извините –

+1

Это свойство только для чтения: http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.status.aspx. – dartonw

+0

@ StéphaneLacasse, я также назначил его переменной '$ s = (Get-Service -Computername RemoteHost -Name MyService)', а затем просто выполнил '$ s.Stop()'. Затем я сделал «Write-host $ ($ s.Status)», и служба все еще работала, но если я дождался 10 секунд для остановки службы, а затем сделал '$ s = (Get-Service ...' и 'Write-host $ ($ s.Status)' снова, он вернулся со статусом 'Stopped' – Baodad

-2

stop-service -inputobject $(get-service -ComputerName remotePC -Name Spooler)

Это терпит неудачу из-за ваших переменных -ComputerName remotePC потребности быть переменной $remotePC или строка "remotePC" -Name Spooler (то же самое для спулером)

1

Это работало для меня , но я использовал его как начало. выходы powershell, ждут обслуживания, чтобы начать финишировать, а затем заканчивается, а затем служба-получатель на удаленном сервере показывает, что сервис запущен.

**start**-service -inputobject $(get-service -ComputerName remotePC -Name Spooler) 
3

Основываясь на встроенных примерах Powershell, это то, что предлагает Microsoft. Испытано и проверено:

Для остановки:

(Get-WmiObject Win32_Service -filter "name='IPEventWatcher'" -ComputerName Server01).StopService() 

Для начала:

(Get-WmiObject Win32_Service -filter "name='IPEventWatcher'" -ComputerName Server01).StartService() 
2

Благодаря взносам каждого на этот вопрос, я придумал следующий сценарий. Измените значения для $SvcName и $SvrName в соответствии с вашими потребностями. Этот скрипт запустит удаленный сервис, если он остановлен, или остановите его, если он запущен. И он использует классный метод .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 на более старую машину.

0

Другая опция; использовать 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, чтобы работать на цели машина. Вы можете настроить брандмауэр, выполнив следующий сценарий непосредственно на целевом компьютере (одна задача): Enable-PSRemoting -force.

Смежные вопросы