当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 了解适用于 Windows 的 PowerShell Start Service 和其他 cmdlet

作者:精品下载站 日期:2024-12-14 13:02:52 浏览:14 分类:玩电脑

了解适用于 Windows 的 PowerShell Start Service 和其他 cmdlet


Windows 服务是几乎每个 Windows 系统管理员都必须处理的主题之一。要管理 Windows 服务,您可以启动 services.msc MMC 管理单元来执行一次性任务,但如果您需要使用 PowerShell 构建某种自动化,该怎么办?在本教程中了解如何使用 PowerShell 获取服务、使用 PowerShell 启动服务 cmdlet、使用 PowerShell 停止服务以及使用 PowerShell 重新启动服务!

是时候学习如何使用 PowerShell 管理服务了。

在本教程中,您将了解有关 *-Service PowerShell cmdlet 的所有信息、如何使用它们以及构建您自己的脚本来同时管理多台计算机上的服务。

先决条件

本文将指导您实践了解 PowerShell 如何读取和操作 Windows 服务。如果您想继续阅读,请确保在开始本文之前满足以下先决条件。

  1. 至少一台 Windows 计算机。如果您有不止一台计算机,那么学习如何同时管理多台计算机将会有所帮助。
  2. PowerShell 7 - 尽管大多数概念与 Windows PowerShell 相同,但您仍将坚持使用最新版本的 PowerShell
  3. 在您想要查询的任何远程计算机上启用 PowerShell 远程处理。

使用 PowerShell 通过 Get-Service 列出服务

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

请注意,在下面的屏幕截图中,单独运行 Get-Service 将列出本地计算机上的所有服务以及 StatusName每个服务的 DisplayName

[玩转系统] 了解适用于 Windows 的 PowerShell Start Service 和其他 cmdlet

与许多其他 cmdlet 一样,PowerShell 不会返回每个服务的所有属性。例如,如果您想查看某个服务所需的服务或者服务描述,则可以通过使用 * 将输出通过管道传输到 Select-Object 来查找这些属性表示所有属性,如以下屏幕截图所示。

[玩转系统] 了解适用于 Windows 的 PowerShell Start Service 和其他 cmdlet

寻找远程服务

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

不过,使用 PowerShell Core,仍然可以使用两种不同的方法查找远程服务: PowerShell 远程处理 CIM/WMI。

Get-Service 和 PowerShell 远程处理

远程检查 Windows 服务的一种方法是使用 PowerShell 远程处理 (PS Remoting)。通过使用 PS Remoting,您可以封装任何本地命令并在远程会话中调用它,就像在本地执行操作一样。

例如,假设您在远程计算机上启用了 PowerShell Remoting,则可以使用 Invoke-Command 在远程计算机上运行 Get-Service,如下所示。

请注意,您在 Active Directory (AD) 环境中不需要 Credential 参数。

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

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

[玩转系统] 了解适用于 Windows 的 PowerShell Start Service 和其他 cmdlet

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

$cred = Get-Credential
 $computers = Get-Content -Path 'C:\computers.txt'
 foreach ($name in $computers) {
     $services = Invoke-Command -ComputerName $name -Credential $cred -ScriptBlock {Get-Service}
     [pscustomobject]@{
         ComputerName = $name
         Services = $services
     }
 }

使用 CIM/WMI 查找服务

在某些情况下,使用 PowerShell 和 Get-Service 可能不合适。相反,您可以通过 CIM 会话查询 CIM/WMI。如果使用 CIM 会话,则不必使用 PowerShell 远程处理。

要通过 CIM 查找管理服务,您可以:

  1. 创建 PSCredential 对象。在下面的示例中,两台计算机不在 AD 环境中,因此我们需要使用 Credential 参数。
  2. 创建一个 CIM 会话,提供计算机名称和用于进行身份验证的凭据。
  3. 使用Get-CimInstance 查询Win32_Service 类。
$serverName = 'SRV1'
$cred = Get-Credential
$cimSession = New-CimSession -ComputerName $serverName -Credential $cred
Get-CimInstance -CimSession $cimSession -ClassName Win32_Service

## Don't forget to remove the CIM session when you're done
Remove-CimSession -CimSession $cimSession

您将在下面看到返回的大部分相同信息,但格式略有不同。

[玩转系统] 了解适用于 Windows 的 PowerShell Start Service 和其他 cmdlet

PowerShell 启动服务和停止服务 Cmdlet

您还可以使用 PowerShell 启动和停止服务。有几种方法可以实现这一点。

使用 PowerShell Start-ServiceStop-Service

首先,您可以使用 Start-ServiceStop-Service cmdlet。这些 cmdlet 完全符合您的预期。要使用它们,您可以使用管道或使用 Name 参数,如下所示。

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

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

所有 *-Service cmdlet 都允许您使用 NameDisplayName 参数按 Tab 键补全服务名称值。只需输入 -Name 后跟一个空格,然后开始按 Tab 键。您将看到它循环访问本地计算机上的所有服务。

同样的概念也适用于作为服务启动。

## Stop a service with the Name parameter
$serviceName = 'wuauserv'
Start-Service -Name $serviceName

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

Stop-ServiceStart-Service cmdlet 都是幂等的,这意味着如果服务已停止或启动,并且您尝试在服务停止或启动时停止或启动该服务,如果已经处于该状态,cmdlet 将直接跳过该服务。

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

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

在此 Invoke-Command 帖子中了解 $using 构造以及如何将本地变量传递到远程脚本块。

使用PowerShell和CIM启动/停止服务

Get-Service 一样,您还可以使用 CIM 来启动和停止服务。不过,您不能直接使用 Stop-ServiceStart-Service 等 cmdlet。相反,您必须调用一个方法。虽然不太直观,但如果您已经使用 CIM 管理一些事情,那么以这种方式管理服务可能也是有意义的。

如果您使用本地服务,请再次使用 Get-CimInstance。但这一次,您必须使用 Filter 参数将服务限制为仅您想要停止或启动的服务。 Filter 参数(以及 Query 参数)是限制结果的好方法。

下面的例子是:

  • 查询本地计算机的 CIM 存储的 Win32_Service 类中所有启动类型设置为自动 (StartMode='Auto') 的服务
  • 查询本地计算机的 CIM 存储的 Win32_Service 类以查找也已停止的所有服务 (State='Stopped')
  • 将所有这些对象传递给 Invoke-CimMethod,然后调用每个对象的 StartService 方法。
Get-CimInstance -ClassName Win32_Service  -Filter "StartMode='Auto' And State='Stopped'" | Invoke-CimMethod -MethodName StartService

上面的相同代码也可以使用 StopService 方法停止服务,并且可能将查询中的 State 更改为 Started

Filter 参数接受称为 WQL 的语言。您可以在 PowerShell 的 about_WQL 帮助主题中了解有关 WQL 的更多信息。

使用 PowerShell 启动/停止远程服务

因此,您知道如何在本地启动和停止服务,您还可以使用用于枚举服务的类似代码将其扩展到远程计算机。

请注意,您始终可以使用 PowerShell Remoting 将任何代码包装在脚本块中并远程执行。本教程将假设您从现在开始就意识到了这种潜力,并且不会涵盖所有场景的此选项。

要远程启动和停止服务,您可以再次使用 CIM 会话。您可以重复使用上面创建的 CIM 会话,或者如果您删除了它,则创建另一个会话,如下所示。

$serverName = 'SRV1'
$cred = Get-Credential
$cimSession = New-CimSession -ComputerName $serverName -Credential $cred

创建 CIM 会话后,请使用 Invoke-CimMethod cmdlet,并且不要忘记在完成后删除该 CIM 会话。

Get-CimInstance -CimSession $cimSession -ClassName Win32_Service  -Filter "StartMode='Auto' And State='Stopped'" | Invoke-CimMethod -MethodName StartService
Remove-CimSession -CimSession $cimSession

您不必使用 CIM 会话来管理远程 Windows 服务。如果本地和远程计算机都是 AD 域的成员,则可以使用 Get-CimInstance 和 ComputerName 参数。但是,如果必须将凭据传递给远程计算机,则必须使用CIM 会议。

如果您需要在远程计算机上执行多个 CIM 方法或执行 CIM 查询,CIM 会话也会更加高效,因为它会重复使用同一会话,而不必为每个任务创建一个新会话。

使用 PowerShell 重新启动服务

也许您想重新启动已启动的服务。这对于 PowerShell 来说不是问题。同样,你有两种方法。

使用 StartStop-Service

如果您想重新启动已启动的服务,您可以使用 Stop-ServiceStart-Service cmdlet 停止并启动该服务。如下所示的几种不同的方式。

## Restart a service with the Name parameter
$serviceName = 'wuauserv'
Stop-Service -Name $serviceName
Start-Service -Name $serviceName

## Restart a service with the pipeline and PassThru parameter
$serviceName = 'wuauserv'
Stop-Service -Name $serviceName -Passthru | Start-Service

如果您需要传递 Stop-ServiceStart-Service 刚刚运行的服务对象,并且您希望对其执行某种其他类型的操作通过管道提供服务,您可以使用 PassThru 参数。 PassThru 参数只是告诉 cmdlet 将对象返回到管道,然后允许您将该对象通过管道传输到其他 cmdlet。

使用 PowerShell Restart-Service cmdlet

要限制使用 PowerShell 重新启动服务的代码,最好使用 Restart-Service cmdlet。此 cmdlet 完全符合您的想法,并且操作方式与其他服务 cmdlet 类似。

例如,如果您想启动 wuauserv,如上例所示,您可以通过将 Get-Service 的输出直接通过管道传输到 Restart-Service 如下所示。

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

更改启动类型

管理服务时的另一个常见任务是更改启动类型。启动类型是指示 Windows 启动时服务执行的操作的属性。你有几个选择。

  • 自动(Windows 启动时该服务自动启动)
  • 禁用(该服务永远不会启动)
  • 手动(该服务可以启动,但必须手动完成)
  • 自动化 - 延迟(服务自动启动,但在 Windows 启动后延迟)

假设您首先只需要知道服务的启动类型是什么。您可以使用 Get-Service 或 CIM 找到它。

如果您使用 Get-Service 查找启动类型,您会发现 Get-Service 调用它Status并表示为Status 属性。

(Get-Service -Name wuauserv).StartupType
Automatic

您可以使用Group-Object快速了解所有服务的startuptype值,如下所示。此屏幕截图显示了服务启动类型的所有可能值(在 Name 列中)。

[玩转系统] 了解适用于 Windows 的 PowerShell Start Service 和其他 cmdlet

一旦您知道当前的启动类型,您就可以使用 Set-Service 更改它。

以下示例将启动类型设置为“禁用”。

Set-Service -Name <some service name> -StartupType Disabled

NameDisplayName 参数一样,StartupType 参数允许您使用 Tab 键补全所有可用的启动类型来设置服务也是。

使用注册表

您还可以通过 PowerShell 通过注册表设置服务启动类型。所有 Windows 服务都存储在 HKLM\System\CurrentControlSet\Services 注册表项中。每个服务子键都有一个名为 Start 的 REG_DWORD 值,表示启动类型(不包括延迟启动)。

要通过 PowerShell 设置注册表中服务的启动类型,请使用 Set-ItemProperty cmdlet。下面的代码片段将 wuauserv 服务的启动类型更改为自动。

$serviceName = 'wuauserv'
 Set-ItemProperty "HKLM:\System\CurrentControlSet\Services$serviceName" -Name "Start" -Value 2 -Type DWORD

您将需要一个映射来将每个 REG_DWORD 值定义为您期望的启动类型。您会在下面找到一张方便的桌子。

REG_DWORD Value

启动类型

0

由引导加载程序加载(但未启动)。然后在内核初始化期间启动。

1

在启动参数为 0 的服务之后的内核初始化期间启动。

2

自动地。由 smss.exe(会话管理器)或 services.exe(服务控制器)启动。

3

手动。由服务控制管理器 (SCM) 启动。

4

残疾人

5

延迟启动

您还可以通过 Set-ItemProperty -Path “HKLM:\System\CurrentControlSet\Services\” -Name “DelayedAutostart” 将 DelayedAutoStart 注册表值设置为 1,将启动类型设置为延迟启动-值 1 -输入 DWORD。

下一步

现在您应该了解使用 PowerShell 重新启动服务以及管理它们的基础知识。如果您想了解有关使用 PowerShell 管理服务的更多信息,请务必使用 Get-Help 查看 PowerShell 的帮助内容。

本文未涵盖许多参数,因此如果您在此处没有看到您的特定用例,请不要担心。请务必参阅帮助内容并验证参数是否已经存在。

进一步阅读

为读者提供至少两个指向其他网站的外部链接,读者可以在其中找到更多信息。

  • 使用 PowerShell 设置服务登录帐户
  • 回到基础:PowerShell ForEach 循环 - 这对于同时管理许多远程计算机上的服务非常有用。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯