windows - 远程系统服务重启

标签 windows 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

如果能够让这个过程更加自动化那就太好了。 希望这是有道理的。

谢谢...

最佳答案

您可以使用 Invoke-Command 通过 Powershell 远程处理(通过 WinRM)使用 Restart-Service cmdlet 来执行此操作。请注意,虽然您可以使用管道通过Get-Service获取服务并将其通过管道传输到Stop-ServiceStart- Service,或Restart-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 - 运行命令的计算机/服务器的名称。默认情况下,您的用户帐户必须位于您要连接的服务器上的Administrators 组或Remote Management Users 组中。如有必要,您可以使用 -Credential 参数指定备用凭据。作为额外的好处,您可以传入一组计算机来一次性运行相同的 ScriptBlock

-ArgumentList - 要传递给脚本的参数数组。当 ScriptBlock 在远程计算机上运行时,它无法解析您的本地变量。通常,您可以按 $args[0]$args[1] 等形式访问每个变量,按照变量传入的顺序进行。我喜欢使用一个技巧这是传递命名参数的 HashMap ,以便您可以以更易读的方式访问它们,就像我在下面的 ScriptBlock 中使用 $args.Service1 的方式一样。 p>

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

关于Restart-Service Cmdlet

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

关于windows - 远程系统服务重启,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51144811/

相关文章:

regex - 在字符上分割字符串,但加倍的字符是转义符

service - 如何配置 Windows Server 2012 R2 以允许交互式服务?

python - 如何为 Windows 重写这个多处理代码?

c++ - 如何设置 CMake 与 clang 交叉编译 Windows 上嵌入的 ARM?

java - 如何在 64 位 JVM 上运行 TeamCity

windows - 我可以使用 contains 来匹配对象属性的值吗?

powershell - 使用 Powershell 时找不到 Connect-ServiceFabricCluster cmdlet

tomcat - 安全的 Websocket 连接(wss :) abort in tomcat/spring,,而 https 正在工作

powershell - 使用 powershell 连接到 HTTPS 站点

windows - Wix:使用用户指定的服务名称安装 Windows 服务