Usar o Powershell para parar um serviço remotamente sem WMI ou remoting
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.
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()
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()
**start**-service -inputobject $(get-service -ComputerName remotePC -Name Spooler)
$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.
Também podes fazer (Get-Service -Name "what ever" - ComputerName RemoteHost).Status = "Stopped"
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
.
stop-service -inputobject $(get-service -ComputerName remotePC -Name Spooler)
-ComputerName remotePC
Precisa de ser uma variável $remotePC
ou uma string "remotePC"
-Name Spooler
(a mesma coisa para spooler)
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.