远程系统服务重启

时间:2018-07-02 23:26:07

标签: powershell windows-server-2012-r2

我正在尝试编写PowerShell脚本以在远程系统上重新启动服务?是否可以基于脚本输出启动服务?例如,如果服务状态返回“已停止”状态,请执行以下伪代码...

if {service-status = Stopped | Get-Service -Name ServiceName | Start-Service}

这是我当前代码的示例,如果其中任何一个有意义的话:

# Display status of Sophos Services
$Computer1 = Read-Host -Prompt 'Enter the computer name to check Sophos Services'
Get-Service -DisplayName sop* -ComputerName $Computer1

 # Service Stop
 $Service1 = Read-Host -Prompt 'Enter the service needed to be restarted'
 Echo "Stopping service"
 Read-Host -Prompt "Press Enter to continue"
 Get-Service -Name $Service1 -ComputerName $Computer1 | Stop-Service

 # Service Stop   
 Echo "Starting service"
 Read-Host -Prompt "Press Enter to continue"
 Get-Service -Name $Service1 -ComputerName $Computer1 | Start-Service

最好使流程自动化一些。 希望这有道理。

感谢...

2 个答案:

答案 0 :(得分:3)

您可以使用Restart-Service通过带有Powershell Remoting(通过WinRM)的Invoke-Command cmdlet来执行此操作。请注意,虽然您可以使用管道通过Get-Service获取服务并将其通过管道传输到Stop-ServiceStart-ServiceRestart-Service,但这并不是这里不是真的有必要,而且无论如何您都不能直接在远程服务器上调用它们:

$Computer1 = Read-Host -Prompt 'Enter the computer name to check Sophos Services'

$Service1 = Read-Host -Prompt 'Enter the service needed to be restarted'
Write-Output "Restarting service ${Service1} on ${Computer1}"
Read-Host -Prompt "Press Enter to continue"

# Restart the service on the remote computer
Invoke-Command -ComputerName $Computer1 -ArgumentList @{ Service1 = $Service1 } -ScriptBlock {
    Restart-Service -Name $args.Service1 -Force
}

让我们分解Invoke-Command

-ComputerName-要在其上运行命令的计算机/服务器的名称。默认情况下,您的用户帐户必须位于要连接到的服务器上的AdministratorsRemote Management Users组中。如有必要,可以使用-Credential参数指定备用凭据。另外,您可以传入一系列计算机以一次运行相同的ScriptBlock

-ArgumentList-传递给脚本的参数数组。 ScriptBlock在远程计算机上运行时将无法解析本地变量。通常,您以传入变量的顺序依次访问$args[0]$args[1]等变量。我喜欢使用一个技巧,即传入命名参数的哈希表,以便您可以访问它们以更具可读性的方式呈现,例如我在下面的$args.Service1中使用ScriptBlock的方式。

-ScriptBlock-这是您要执行的远程代码,最好放在ScriptBlock对象中,该对象由两个大括号{}之间的代码表示。在这种情况下,我们正在远程计算机上调用Restart-Service

关于Restart-Service Cmdlet

我之前提到过,您的用户至少必须在远程服务器上的Remote Management Users组中才能使用Powershell Remoting进行连接。确实如此,但在大多数环境中,您需要成为同一远程服务器上Administrators组的成员才能管理服务,包括启动和停止服务。因此,为了使其能够端到端地工作,您需要成为要重新启动服务的远程服务器上的管理员。

答案 1 :(得分:1)

实现您所要求的更“ Powershell方法”:

    function Restart-RemoteService {
    [CMDLETBINDING()]
    param (
        [Parameter(Mandatory)]
        [String] $ServiceName,

        [String] $ComputerName = 'localhost'
    )

    BEGIN {} #BEGIN

    PROCESS {

        $params = @{
            'Name'         = $ServiceName
            'ComputerName' = $ComputerName
        }

        Write-Verbose "Testing status of service"
        $Status = Get-Service @params

        if ($status.Status -eq 'Running') {
            Write-Host "Service $ServiceName has already been running"
        }
        ELSE {
            Write-Host "Starting Service $SeviceName"
            Get-Service @params | Start-Service
        }


    } #PROCESS

    END {} #END

} #function

该功能将:

预期两个参数:

ServiceName,这是必填项,因此如果未提供,则会提示您输入

计算机名,您要在其上启动服务的计算机。如果未提供任何值,则默认为localhost。

然后,我们将解析这些参数以检查服务的状态-如果服务正在运行,则表示什么都不做,如果有其他事情,则将启动服务。

您想将此代码粘贴到Powershell窗口中并运行它,或运行某些代码编辑器(如VS Code)-以便将该函数加载到内存中。

您通过调用其名称来运行它:

Restart-RemoteService

或者您可以传递一些参数,例如:

Restart-RemoteService -ServiceName bits -ComputerName den-dc1.company.pri -Verbose