使用Powershell在没有WMI或远程处理的情况下远程停止服务

时间:2012-04-26 22:48:50

标签: powershell

我遇到了这个似乎有用的衬垫:

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

任何人都可以解释原因,因为我认为停止服务不起作用,除非您使用远程处理或它发生在本地主机上。

9 个答案:

答案 0 :(得分:36)

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

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

答案 1 :(得分:4)

基于内置的Powershell示例,这是微软建议的。经过测试和验证:

停止:

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

开始:

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

答案 2 :(得分:3)

感谢大家对这个问题的贡献,我想出了以下脚本。更改$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。

答案 3 :(得分:2)

这对我有用,但我用它作为开始。 powershell输出, 等待服务开始几次finshing然后完成,然后远程服务器上的get-service显示服务已启动。

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

答案 4 :(得分:0)

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

答案 5 :(得分: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

答案 6 :(得分:0)

您可以只运行 foreach 并启用日志记录。 控制台会显示是否有问题,您可以查看日志。

这样,您就可以单独处理错误。

我认为这种方式比为验证部分运行 Test-Netconnection 效果更好,因为防火墙规则可以创建值 false。

对于此示例,您创建了一个包含列 ServerName 的 csv 文件,并使用 servername.contoso.com 填充该列

$ServerList = "$PSScriptRoot\Serverlist.csv"

$Transcriptlog = "$PSScriptRoot\Transcipt.txt"
    
    Start-Transcript -Path $Transcriptlog -Force
    Get-Date -Format "yyyy/MM/dd HH:mm" 
    
    Try 
     { # Start Try  
       $ImportServerList = Import-Csv $ServerList -Encoding UTF8 | ForEach-Object { # Start Foreach 
        New-Object PsObject -Prop @{ # Start New-Object 
         ServerName = $_.ServerName } # End NewObject 
          Invoke-Command -ComputerName $_.ServerName -ErrorAction Continue -ScriptBlock  { # Start ScriptBlock  
           # Disable Service PrintSpooler
           Get-Service -Name Spooler | Stop-Service -Force 
    
       } # End ScriptBlock
      } # End Foreach       
     } # End Try
    
    Catch
     { # Start Catch 
      Write-Warning -Message "## ERROR## " 
      Write-Warning -Message "## Script could not start ## " 
      Write-Warning $Error[0]
     } # End Catch
    
    Stop-Transcript

答案 7 :(得分:-2)

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

由于您的变量,这会失败 -ComputerName remotePC需要是变量$remotePC或字符串"remotePC" -Name Spooler(假脱机程序相同)

答案 8 :(得分:-5)

据我所知,我现在无法验证,您无法使用Stop-Service cmdlet或.Net停止远程服务,但不支持。

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

现在,如果以上是正确的,没有远程处理或wmi启用,您可以使用AT在远程系统上设置一个在本地运行Stop-Service的预定作业。