Get-Service retorna um objeto ServiceController , que você pode usar para manipular o serviço. Não importa se é local ou remoto. Eu tenho o script abaixo para parar o serviço de spooler (spooler de impressão) e aguardar que ele pare, até 5 segundos. Acabei de adicionar o parâmetro -Name ao Get-Service e consegui parar o spooler em um servidor remoto.
Nota: Ambos os servidores no meu caso eram o Server 2008 R2. Sua milhagem pode variar.
Set-StrictMode -Version "2.0"
[System.ServiceProcess.ServiceController]$service = Get-Service -Name "Spooler" -ComputerName "remote_server.domain.com"
[int]$waitCount = 5
do
{
$waitCount--
switch($service.Status)
{
{ @(
[System.ServiceProcess.ServiceControllerStatus]::ContinuePending,
[System.ServiceProcess.ServiceControllerStatus]::PausePending,
[System.ServiceProcess.ServiceControllerStatus]::StartPending,
[System.ServiceProcess.ServiceControllerStatus]::StopPending) -contains $_ }
{
# A status change is pending. Do nothing.
break;
}
{ @(
[System.ServiceProcess.ServiceControllerStatus]::Paused,
[System.ServiceProcess.ServiceControllerStatus]::Running) -contains $_ }
{
# The service is paused or running. We need to stop it.
$service.Stop()
break;
}
[System.ServiceProcess.ServiceControllerStatus]::Stopped
{
# This is the service state that we want, so do nothing.
break;
}
}
# Sleep, then refresh the service object.
Sleep -Seconds 1
$service.Refresh()
} while (($service.Status -ne [System.ServiceProcess.ServiceControllerStatus]::Stopped) -and ($waitCount -gt 0))
Também existe Set-Service que aceitará um parâmetro de nome de computador, mas não parece ser capaz de interromper um serviço se esse serviço tiver serviços dependentes.