在 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
相关文章
在 PowerShell 中将字符串转换为日期时间
发布时间:2024/02/08 浏览次数:89 分类:编程语言
-
本教程将教你在 PowerShell 中将字符串转换为 DateTime。String 和 DateTime 是 PowerShell 中的两种不同的数据类型。
在 PowerShell 中提取子字符串
发布时间:2024/02/07 浏览次数:162 分类:编程语言
-
本文将讨论如何使用 PowerShell 的字符串库有效地提取字符串中的子字符串。作为 Windows 管理员的一个典型场景是找出一种方法来在称为子字符串的字符串中查找特定的文本片段
在 PowerShell 中连接字符串
发布时间:2024/02/07 浏览次数:175 分类:编程语言
-
本文将展示我们可以在 PowerShell 中使用的所有可能的方法来连接字符串和变量。PowerShell 使用不同的运算符和函数来实现字符串连接。
在 PowerShell 中将字符串转换为整数
发布时间:2024/02/07 浏览次数:132 分类:编程语言
-
本教程将教你在 PowerShell 中将字符串转换为整数。在 PowerShell 中使用 [int] 将字符串转换为整数
在 PowerShell 中将字符串拆分为单独的变量
发布时间:2024/02/07 浏览次数:140 分类:编程语言
-
本教程将介绍在 PowerShell 中将字符串拆分为单独的变量。字符串是用于表示文本的字符序列。它是 PowerShell 中常见的数据类型之一。
在 PowerShell 中获取变量的字符串长度
发布时间:2024/02/07 浏览次数:115 分类:编程语言
-
本教程将教你在 PowerShell 中获取变量的字符串长度。字符串是 PowerShell 中最常用的数据类型之一;它包含字符或文本的序列。你可以使用单引号或双引号定义字符串。
在 PowerShell 中查找子字符串的位置
发布时间:2024/02/07 浏览次数:85 分类:编程语言
-
本教程将教你在 PowerShell 中查找子字符串的位置。PowerShell 中的字符串和子字符串 字符串是 PowerShell 中使用的常见数据类型。
在 PowerShell 中比较两个字符串对象的内容
发布时间:2024/02/07 浏览次数:67 分类:编程语言
-
本教程将教你比较 PowerShell 中两个字符串对象的内容。字符串是 PowerShell 中最常用的数据类型之一。
使用 PowerShell 替换文件中的文本
发布时间:2024/02/07 浏览次数:135 分类:编程语言
-
本教程将教你使用 PowerShell 替换文件中每个出现的字符串。PowerShell 是一个强大的工具,可以执行不同的文件和文件夹操作。