在 PowerShell 中管理服务

Marion Paul Kenneth Mendoza 2023年1月30日
  1. 在 PowerShell 中列出服务
  2. 在 PowerShell 中查找远程服务
  3. 在 PowerShell 中启动和停止服务
  4. 在 PowerShell 中重新启动服务
  5. 在 PowerShell 中更改服务的启动类型
在 PowerShell 中管理服务

Windows 服务是几乎每个 Windows 系统管理员都必须使用的主题之一。当然,要管理 Windows 服务,我们可以启动 services.msc MMC 管理单元来完成一次性任务,但是如果我们需要使用 PowerShell 构建一些自动化呢?

本文将讨论所有 PowerShell 服务 cmdlet、使用它们并开发我们的脚本以在本地或远程管理多台计算机上的服务。

在 PowerShell 中列出服务

我们可以使用 Windows PowerShell 和服务完成的最基本任务之一就是简单地枚举本地或远程计算机上存在的服务。例如,打开 PowerShell,运行 Get-Service 命令,然后观察输出。

Get-Service 命令本身将列出本地计算机上的所有服务以及每个服务的 StatusNameDisplayName

Get-Service

输出:

Status   Name               DisplayName
------   ----               -----------
Stopped  AarSvc_55244       AarSvc_55244
Stopped  AJRouter           AllJoyn Router Service
Stopped  ALG                Application Layer Gateway Service
Running  AMD Crash Defen... AMD Crash Defender Service
<SNIP>

与许多其他 cmdlet 一样,PowerShell 不会返回每个服务的所有属性。

例如,虽然我们希望查看所需的服务或服务描述,但我们可以通过将结果传递给 Select-Object 命令并使用 * 通配符来表示所有属性来找到这些属性。

Get-Service ALG | Select *

输出:

Name                : ALG
RequiredServices    : {}
CanPauseAndContinue : False
CanShutdown         : False
CanStop             : False
DisplayName         : Application Layer Gateway Service
DependentServices   : {}
MachineName         : .
ServiceName         : ALG
ServicesDependedOn  : {}
ServiceHandle       :
Status              : Stopped
ServiceType         : Win32OwnProcess
StartType           : Manual
Site                :
Container           :

在 PowerShell 中查找远程服务

也许我们在网络上,需要在一台或多台远程 Windows 计算机上枚举服务。在 Windows PowerShell 时代,我们可以通过使用 -ComputerName 参数来完成此操作,但不幸的是,该参数不再存在。

检查远程计算机上的 Windows 服务的一种方法是使用 Windows PowerShell Remoting(或 PS Remoting)。使用 PS Remoting 可以封装任何本地命令并在远程会话中调用它,就像我们在本地执行它一样。

假设我们在远程计算机上启用了 PowerShell Remoting,例如,我们可以使用 Invoke-Command cmdlet 在远程计算机上运行 Get-Service 命令。

$cred = Get-Credential
Invoke-Command -ComputerName SRV1 -ScriptBlock { Get-Service } -Credential $cred

输出:

Status         Name          DisplayName     PSComputerName
------         ----          -----------     --------------
Stopped     AarSvc_55244     AarSvc_55244        SRV1
<SNIP>

执行后,Invoke-Command cmdlet 会传递 Get-Service 返回的所有信息,并且服务将按预期返回给你。

请注意 Invoke-Command cmdlet 返回的额外 PSComputerName 属性。我们还可以创建一个简单的脚本来枚举许多远程计算机上的服务。

在 PowerShell 中启动和停止服务

我们还可以使用 Windows PowerShell 启动和停止服务。

Start-ServiceStop-Service cmdlet 完全符合我们的预期。接下来,我们可以使用下面的管道或 -Name 参数。

## Stop a service
$serviceName = 'wuauserv'
Stop-Service -Name $serviceName

## Stop a service with the pipeline
Get-Service $wuauserv | Stop-Service

所有*-Service cmdlet 都允许我们使用 -Name-DisplayName 参数来完成服务名称值。只需键入 -Name 参数,后跟一个空格,然后按 Tab 键。

我们将看到它循环遍历本地计算机上的所有服务。同样的概念也适用于作为服务启动。

## Start a service
$serviceName = 'wuauserv'
Start-Service -Name $serviceName

## Start service with the pipeline
Get-Service $wuauserv | Start-Service

Start-ServiceStop-Service 命令都是幂等的,这意味着如果服务已启动或已停止,并且当服务已处于该状态时我们尝试停止或启动该服务,则 cmdlet 将跳过该服务.

同样,要使用 PowerShell 停止和启动远程服务,你需要将这些命令包装在脚本块中,并使用 PowerShell Remoting 远程调用它们,如下所示。

$cred = Get-Credential
$serviceName = 'wuauserv'
Invoke-Command -ComputerName SRV02 -ScriptBlock { Start-Service -Name $using:serviceName } -Credential $cred

在 PowerShell 中重新启动服务

为了限制代码重用以使用 Windows PowerShell 重新启动服务,我们最好使用 Restart-Service cmdlet。这个 cmdlet 精确地执行我们的想法,并且与其他服务命令类似地操作。

例如,如果我们想启动和停止如上例所示的 wuauserv 服务,我们可以通过将 Get-Service 的输出直接通过管道传输到 Restart-Service 来节省一些代码,如下所示以下。

## Restart a service with the Name parameter
$serviceName = 'wuauserv'
Get-Service -Name $serviceName | Restart-Service

在 PowerShell 中更改服务的启动类型

服务的启动类型是指示 Windows 启动时服务做什么的属性。再说一次,我们有几个选择。

  • 自动:该服务在 Windows 启动时自动启动。
  • 禁用:除非更改,否则服务将永远不会启动。
  • 手动:服务可以启动,但必须手动完成。
  • 自动 - 延迟:服务自动启动,但在 Windows 启动后延迟。

首先,我们需要知道什么是启动类型。你可以通过 Get-Service 找到它。

如果你使用 Get-Service 查找启动类型,你会发现 Get-Service 将其称为 Status 并表示为 Status 属性。

(Get-Service -Name wuauserv | select *).StartType

输出:

Manual

一旦你知道当前的启动类型,我们就可以使用 Set-Service 对其进行更改。下面的示例将启动类型设置为自动

Set-Service -Name <service name> -StartupType Automatic
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn

相关文章 - PowerShell Service