停止或启动远程计算机上的服务

时间:2017-04-14 19:03:18

标签: powershell

我创建了一个脚本,根据它的显示名称启动或停止服务。我的脚本在本地计算机上运行,​​但我想确保它可以在远程计算机和本地计算机上完成。我不知道如何让它在远程机器上工作。

任何帮助将不胜感激。

int result = (n % 2 == 1) ? k : 0;

3 个答案:

答案 0 :(得分:2)

您无法将Start-Service / Stop-Service用于远程计算机,但您可以从Get-Service(使用ComputerName参数)传递服务对象Set-Service可以为远程计算机执行相同的启动/停止操作:

Get-Service $ServiceName -ComputerName $ComputerName | Set-Service -Status Running

我发现这比使用PowerShell Remoting或WMI命令容易得多。

您可以使用最少的代码更改轻松更新代码:

$serviceName = Read-Host -Prompt 'Please enter service name: '

#get computername or use localhost for local computer
if(($ComputerName = Read-Host 'Enter Computer Name, leave blank for local computer') -eq ''){$ComputerName = 'localhost'}

$Service = Get-Service -DisplayName $serviceName -ComputerName $ComputerName -ErrorAction SilentlyContinue

# Check that service name exists
if ($Service) {
    # Check that service name is not empty
    if([string]::IsNullOrEmpty($serviceName)){Write-Host 'Service name is NULL or EMPTY'}
    else {    
        $Choice =  Read-Host -Prompt 'Would you like to start or stop the service'

        #Start service
        If ($Choice -eq 'start') {
            $Service | Set-Service -Status Running
            Write-Host $serviceName 'Starting...' -ForegroundColor Green
        }

        #Stop service
        If ($Choice -eq 'stop') {
          $Service | Set-Service -Status Stopped
          Write-Host $serviceName 'Stopping...' -ForegroundColor Green
        }
    }
}
else {            
    Write-Host 'Service name does not exist'            
}

答案 1 :(得分:1)

假设您尚未禁用PowerShell远程处理,最简单的方法是将其包含在ComputerName作为可选参数的函数中,然后使用Invoke-Command和splat {{1} }。

PSBoundParameters

然后你可以在没有参数的情况下调用Function Toggle-Service{ [cmdletbinding()] Param([string[]]$ComputerName) $serviceName = Read-Host -Prompt 'Please enter service name: ' # Check that service name exists If (Invoke-Command -ScriptBlock {Get-Service $serviceName -ErrorAction SilentlyContinue} @PSBoundParameters) { # Check that service name is not empty if([string]::IsNullOrEmpty($serviceName)) { Write-Host "Service name is NULL or EMPTY" } else { $Choice = Read-Host -Prompt 'Would you like to start or stop the service' #Start service If ($Choice -eq 'start') { Invoke-Command -ScriptBlock {Start-Service -displayname $serviceName} @PSBoundParameters Write-Host $serviceName "Starting..." -ForegroundColor Green } #Stop service If ($Choice -eq 'stop') { Invoke-Command -ScriptBlock {Stop-Service -displayname $serviceName} @PSBoundParameters Write-Host $serviceName "Stopping..." -ForegroundColor Green } } } else { Write-Host "Service name does not exist" } } 来在本地执行它,或者包含远程服务器的名称以在该服务器上执行操作。

答案 2 :(得分:0)

Start-ServiceStop-Service不适用于远程计算机。您将需要进行PowerShell远程处理或使用WMI。在我的环境中,PowerShell远程处理默认被阻止,但我们使用WMI代替;通过Get-WMIObject检索的服务对象有一个名为Start-Service()的方法,可以在检索到的服务对象上调用:

(Get-WmiObject -ComputerName $ComputerName -Class Win32_Service -Filter "Name='$ServiceName'").StartService()

使用WMI在远程计算机上停止服务的方式相同;您可以改为调用服务对象的StopService()方法。

我建议您阅读Get-Help Get-WMIObjectthe MSDN reference on the Win32_Service class中的信息。

ETA:应该注意的是,通过省略-ComputerName参数,WMI也可以在本地计算机上运行。