在 PowerShell 中管理服务
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
相关文章
在 Windows PowerShell 中获取命令行参数
发布时间:2024/03/04 浏览次数:358 分类:编程语言
-
本文将解释我们如何使用 PowerShell 的参数函数处理命令行参数,参数如何工作,我们如何使用 PowerShell 参数将值传递给参数,以及定义参数的基本方法是什么。
Windows PowerShell 中的 Base64 编码
发布时间:2024/03/04 浏览次数:332 分类:编程语言
-
本文将展示如何编码和解码 base64 字符串。Windows PowerShell 当前版本没有本机命令,因此我们将向你展示如何执行此操作的替代方法。
在 Windows PowerShell 中写入输出
发布时间:2024/03/04 浏览次数:259 分类:编程语言
-
本文将向你展示如何在 Windows PowerShell 中编写或打印输出。本文还将区分多个 write cmdlet 并解释它们的意义。
在 Windows PowerShell 中设置 PATH 环境变量
发布时间:2024/03/04 浏览次数:350 分类:编程语言
-
本文将展示在 Windows PowerShell 中设置路径环境变量的正确方法。本文还展示了如何在持久性和非持久性方法中设置变量。
在 Windows PowerShell 中打印环境变量
发布时间:2024/03/04 浏览次数:869 分类:编程语言
-
本文将讨论什么是环境变量以及如何使用多个 Windows PowerShell 命令打印它们。
在 PowerShell 中注释代码
发布时间:2024/03/04 浏览次数:363 分类:编程语言
-
本文将展示在 Windows PowerShell 中注释代码的多种方法。本文还介绍了注释代码时的一些最佳实践。
在 PowerShell 中执行 LDAP 查询
发布时间:2024/03/04 浏览次数:304 分类:编程语言
-
本文将深入了解如何使用 Active Directory 过滤器和 LDAP 过滤器。