Merci à la contribution de chacun à cette question, je suis venu avec le script suivant. Changez les valeurs pour $SvcName
et $SvrName
pour répondre à vos besoins. Ce script démarrera le service distant s'il est arrêté ou l'arrêtera s'il est démarré. Et il utilise la méthode cool .WaitForStatus
pour attendre pendant que le service répond.
#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)"
}
Bien sûr, le compte que vous exécutez cette sous aura besoin des privilèges appropriés pour accéder à l'ordinateur distant et démarrer et arrêter les services. Et lorsque vous l'exécutez sur des machines distantes plus anciennes, vous devez d'abord installer WinRM 3.0 sur l'ancienne machine.
Remarque: Vous avez testé cette méthode et elle appelle l'hôte distant, mais n'attend pas que le service s'arrête avant de poursuivre le script. Si vous faites un Stop() et Start(), le Start() échouera probablement parce que le Service n'est pas encore arrêté. Juste pour info, si vous voulez faire plus que Stop dans votre script (ce qui dépasse cette question) –
Juste une question PowerShell je pense: Est-il possible de le faire à partir d'un fichier batch comme mettre plusieurs de ces lignes pour plusieurs machines après l'un l'autre (comme .bat) – Hace
Dans les versions plus récentes (3+?) de Powershell vous pouvez obtenir le service et ensuite utiliser sa méthode ['.WaitForStatus'] (http://www.powershellmagazine.com/2013/04/10/pstip-wait-for-a-service-to-reach-a-specified-status /) – Baodad