Usar o Powershell para parar um serviço remotamente sem WMI ou remoting

Deparei-me com um transatlântico que parece funcionar.
stop-service -inputobject $(get-service -ComputerName remotePC -Name Spooler)
Alguém pode explicar porquê, porque pensei que o stop-service não funcionasse, a menos que usasse remoting ou tivesse ocorrido no hospedeiro local.

 21
Author: fenster, 2012-04-27

8 answers

A saída de Get-Service é uma classe System.ServiceProcess.ServiceController. NET que pode funcionar em computadores remotos. Como consegue isso, não sei, provavelmente DCOM ou WMI. Uma vez que você tenha obtido um destes de Get-Service, ele pode ser passado para Stop-Service que provavelmente apenas chama o método Stop() sobre este objeto. Isso impede o serviço na máquina remota. Na verdade, você provavelmente poderia fazer isso também:

(get-service -ComputerName remotePC -Name Spooler).Stop()
 31
Author: Keith Hill, 2012-04-27 00:26:43

Baseado nos exemplos do Powershell built-in, isto é o que a Microsoft sugere. Testado e verificado:

Para parar:

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

Para começar:

(Get-WmiObject Win32_Service -filter "name='IPEventWatcher'" -ComputerName Server01).StartService()
 4
Author: Sam Murcio, 2015-12-29 17:32:15
Isto funcionou comigo, mas usei-o como começo. resultados do 'powershell', à espera que o serviço finshing inicie algumas vezes, em seguida, termina e, em seguida, um get-service no servidor remoto mostra o serviço iniciado.
**start**-service -inputobject $(get-service -ComputerName remotePC -Name Spooler)
 2
Author: timassin, 2013-09-11 12:05:32
Graças às contribuições de todos para esta pergunta, arranjei o seguinte guião. Mude os valores de $SvcName e $SvrName para satisfazer as suas necessidades. Este programa irá iniciar o serviço remoto se for parado, ou pará-lo se for iniciado. E ele usa o método cool .WaitForStatus para esperar enquanto o serviço responde.
#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)"
}

Claro, a conta em que você executa isto vai precisar dos privilégios adequados para aceder ao computador remoto e iniciar e parar os Serviços. E ao executar isto contra máquinas remotas mais antigas, você pode primeiro ter que instalar WinRM 3.0 na máquina mais antiga.

 2
Author: Baodad, 2014-07-09 05:42:07

Também podes fazer (Get-Service -Name "what ever" - ComputerName RemoteHost).Status = "Stopped"

 0
Author: Stéphane Lacasse, 2012-11-13 01:38:09

Outra opção; Usar 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: para usar esta opção, terá de instalar o PowerShell na máquina remota e para a firewall permitir pedidos através, e para que o serviço de gestão remota do Windows esteja a correr na máquina-alvo. Poderá configurar a firewall se executar o seguinte programa directamente na máquina de destino (uma tarefa fora de serviço): Enable-PSRemoting -force.

 0
Author: JohnLBevan, 2015-03-06 13:52:40

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

Isto falha por causa das tuas variáveis. -ComputerName remotePC Precisa de ser uma variável $remotePC ou uma string "remotePC" -Name Spooler (a mesma coisa para spooler)
 -2
Author: PhilB, 2013-05-23 16:58:30

Tanto quanto sei, e não posso verificá-lo agora, você não pode parar os Serviços Remotos com o cmdlet Stop-Service ou com.Net, ele não é suportado.

Sim, funciona, mas não no computador remoto.

Agora, se o acima estiver correcto, sem a remoting ou WMI activada, poderá definir uma tarefa agendada no sistema remoto, usando o AT, que executa o serviço de paragem localmente.

 -5
Author: Shay Levy, 2012-04-27 11:49:52