在 PowerShell 中管理服务
- 在 PowerShell 中列出服务
- 在 PowerShell 中查找远程服务
- 在 PowerShell 中启动和停止服务
- 在 PowerShell 中重新启动服务
- 在 PowerShell 中更改服务的启动类型
![在 PowerShell 中管理服务](/img/PowerShell/feature-image---managing-services-in-powershell.webp)
Windows 服务是几乎每个 Windows 系统管理员都必须使用的主题之一。当然,要管理 Windows 服务,我们可以启动 services.msc
MMC 管理单元来完成一次性任务,但是如果我们需要使用 PowerShell 构建一些自动化呢?
本文将讨论所有 PowerShell 服务 cmdlet、使用它们并开发我们的脚本以在本地或远程管理多台计算机上的服务。
在 PowerShell 中列出服务
我们可以使用 Windows PowerShell 和服务完成的最基本任务之一就是简单地枚举本地或远程计算机上存在的服务。例如,打开 PowerShell,运行 Get-Service
命令,然后观察输出。
Get-Service
命令本身将列出本地计算机上的所有服务以及每个服务的 Status
、Name
和 DisplayName
。
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-Service
和 Stop-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-Service
和 Stop-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 specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn