2012-04-26 3 views

Répondre

30

La sortie de Get-Service est une classe .NET System.ServiceProcess.ServiceController pouvant fonctionner sur des ordinateurs distants. Comment cela accomplit cela, je ne sais pas - probablement DCOM ou WMI. Une fois que vous avez obtenu un de ces Get-Service, il peut être passé en Stop-Service qui probablement appelle simplement la méthode Stop() sur cet objet. Cela arrête le service sur la machine distante. En fait, vous pourriez probablement faire ainsi:

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

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) –

+0

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

+0

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

-5

Pour autant que je sache, et je ne peux pas vérifier maintenant, vous ne pouvez pas arrêter les services à distance avec l'applet de commande Stop-service ou avec .Net, il est prise en charge.

Oui cela fonctionne, mais cela stoppe le service sur votre machine locale, pas sur l'ordinateur distant. Maintenant, si ce qui précède est correct, sans l'accès distant ou WMI, vous pouvez définir un travail planifié sur le système distant, en utilisant AT, qui exécute Stop-Service localement.

+1

J'ai vérifié que cela fonctionne et n'arrête pas le service sur la machine locale. Je suis surpris qu'il ne soit pas plus largement connu/utilisé. – fenster

+0

Je le reprends. Ça marche! Je ne savais pas que tu pouvais faire ça :) –

0

Vous pouvez également faire (Get-Service -Name "what ever" - ComputerName RemoteHost).Status = "Stopped"

+2

hmm oublie ça. Si get-service à nouveau, il est toujours au même état. J'assignais ceci à une variable et, ainsi, assigner l'attribut d'état fonctionne, mais n'arrête pas réellement le service sur l'hôte distant. Désolé –

+1

Il s'agit d'une propriété en lecture seule: http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.status.aspx. – dartonw

+0

@ StéphaneLacasse, je l'ai également assigné à une variable '$ s = (Get-Service -Nom d'ordinateur distant -Nom MyService)', puis juste exécuté '$ s.Stop()'. Puis j'ai fait 'Write-host $ ($ s.Status)' et le service était toujours en cours d'exécution, mais si j'ai attendu 10 secondes pour que le service s'arrête, et ensuite '$ s = (Get-Service ...' et 'Write-host $ ($ s.Status)' à nouveau, il est revenu avec le statut 'Stopped' – Baodad

-2

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

Cela échoue à cause de vos variables -ComputerName remotePC a besoin d'être une variable $remotePC ou une chaîne "remotePC" -Name Spooler (même chose pour spooler)

1

Cela a fonctionné pour moi , mais je l'ai utilisé comme début. sorties powershell, en attente de service à finshing en commençant quelques fois puis se termine puis un get-service sur le serveur distant montre le service a commencé.

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

Basé sur les exemples Powershell intégrés, c'est ce que Microsoft suggère. Testé et vérifié:

Pour arrêter:

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

Pour commencer:

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

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.

0

Une autre option; utiliser 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: Pour utiliser cette option, vous aurez besoin PowerShell être installé sur la machine distante et pour le pare-feu pour autoriser les demandes par et pour le service de gestion à distance de Windows pour exécuter sur la cible machine. Vous pouvez configurer le pare-feu en exécutant le script suivant directement sur la machine cible (une seule tâche): Enable-PSRemoting -force.

Questions connexes