2012-04-26 78 views
21

我对面出现工作这一个班轮传来:使用PowerShell停止远程没有WMI服务或远程

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

任何人都可以解释为什么,因为我认为停止服务没有,除非你工作,要么使用远程或发生在本地主机上。

回答

30

Get-Service的输出是一个可在远程计算机上运行的.NET类。它是如何实现的,我不知道 - 可能是DCOM或WMI。一旦你从Get-Service得到其中的一个,它可以被传递到Stop-Service,这很可能就是在这个对象上调用Stop()方法。这会停止远程计算机上的服务。事实上,你很可能这样做还有:

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

注意:测试此方法后,它确实会调用远程主机,但不会等待服务停止,然后再继续执行脚本。如果您执行Stop()和Start(),则Start()可能会失败,因为服务尚未停止。只是FYI,如果你想做更多,然后在你的脚本停止(这是超出了这个问题的要求) – 2013-03-05 20:10:23

+0

只是一个PowerShell的问题,我认为:是否有可能做到这一点从一个批处理文件,彼此(比如.bat) – Hace 2013-11-22 11:06:01

+0

在Powershell的新版本(3+?)中,您可以获得该服务,然后使用其[[.WaitForStatus'方法](http://www.powershellmagazine.com/2013/04/10/pstip-wait-for-a-service-to-reach-a-specified-status /) – Baodad 2014-11-19 17:45:30

-5

据我知道的,我现在不能确认它,你不能停止的停止服务cmdlet或与.net远程服务,它不是支持的。

是的,它可以工作,但它会在本地机器上停止服务,而不是在远程计算机上。

现在,如果以上方法正确,未启用远程处理或wmi,则可以使用AT在远程系统上设置计划作业,该作业在本地运行Stop-Service。

+1

我已验证它确实可行,并且不会停止本地计算机上的服务。我很惊讶它没有被广泛使用。 – fenster 2012-04-27 16:32:05

+0

我收回。有用!我不知道你可以这样做:) – 2012-04-29 08:09:03

0

你也可以做(Get-Service -Name "what ever" - ComputerName RemoteHost).Status = "Stopped"

+2

嗯忘记了。如果再次获得服务,它仍然处于相同的状态。我将它分配给一个变量,因此,分配状态属性作品,但它实际上并没有停止远程主机上的服务。对不起 – 2012-11-13 01:44:56

+1

这是一个只读属性:http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.status.aspx。 – dartonw 2013-05-03 04:04:26

+0

@StéphaneLacasse,我也将它分配给一个变量'$ s =(Get-Service -Computername RemoteHost -Name MyService)',然后执行'$ s.Stop()'。然后,我写了'Write-host $($ s.Status)',服务仍在运行,但是如果我等待10秒钟服务停止,然后执行了'$ s =(Get-Service ...'和'Write-host $($ s.Status)',它又回来了,状态为'Stopped' – Baodad 2014-07-09 04:31:40

-2

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

失败的原因是你的变量 -ComputerName remotePC需求是一个变量$remotePC或字符串"remotePC" -Name Spooler(用于后台处理程序同样的事情)

1

这为我工作,但我用它作为开始。 PowerShell输出, 等待服务开始几次完成然后完成,然后远程服务器上的获取服务显示服务已启动。

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

基于内置的Powershell示例,这就是Microsoft的建议。测试和验证:

要停止:

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

要启动:

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

感谢大家对这个问题的贡献,我想出了下面的脚本。更改$SvcName$SvrName的值以满足您的需求。如果该脚本停止,该脚本将启动远程服务,如果该服务已启动,则停止该服务。它使用酷的.WaitForStatus方法等待服务响应。

#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)" 
} 

当然,您在其下运行的帐户需要适当的权限才能访问远程计算机并启动和停止服务。在针对较早的远程机器执行此操作时,您可能必须首先在旧机器上安装WinRM 3.0。

0

另一种选择;使用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 

注意:使用该选项,你需要的PowerShell将在远程计算机上和防火墙允许通过请求安装,并为Windows远程管理服务将在目标上运行机。您可以通过在目标机器上直接运行以下脚本来配置防火墙(一次性任务):Enable-PSRemoting -force