[玩转系统] 了解适用于 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 服务。如果您想继续阅读,请确保在开始本文之前满足以下先决条件。
- 至少一台 Windows 计算机。如果您有不止一台计算机,那么学习如何同时管理多台计算机将会有所帮助。
- PowerShell 7 - 尽管大多数概念与 Windows PowerShell 相同,但您仍将坚持使用最新版本的 PowerShell
- 在您想要查询的任何远程计算机上启用 PowerShell 远程处理。
使用 PowerShell 通过 Get-Service
列出服务
使用 PowerShell 和 Windows 服务可以完成的最基本任务之一就是简单地枚举本地计算机上存在的服务。例如,打开 PowerShell 并运行 Get-Service 并观察输出。
请注意,在下面的屏幕截图中,单独运行 Get-Service
将列出本地计算机上的所有服务以及 Status
、Name
和 每个服务的 DisplayName
。
与许多其他 cmdlet 一样,PowerShell 不会返回每个服务的所有属性。例如,如果您想查看某个服务所需的服务或者服务描述,则可以通过使用 *
将输出通过管道传输到 Select-Object
来查找这些属性表示所有属性,如以下屏幕截图所示。
寻找远程服务
也许您在网络上,需要枚举一台或多台远程 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
返回的所有信息,并且服务将按预期返回给您。
请注意额外的 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 查找管理服务,您可以:
- 创建 PSCredential 对象。在下面的示例中,两台计算机不在 AD 环境中,因此我们需要使用
Credential
参数。 - 创建一个 CIM 会话,提供计算机名称和用于进行身份验证的凭据。
- 使用
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
您将在下面看到返回的大部分相同信息,但格式略有不同。
PowerShell 启动服务和停止服务 Cmdlet
您还可以使用 PowerShell 启动和停止服务。有几种方法可以实现这一点。
使用 PowerShell Start-Service
和 Stop-Service
首先,您可以使用 Start-Service
和 Stop-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 都允许您使用 Name
和 DisplayName
参数按 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-Service
和 Start-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-Service
和 Start-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 来说不是问题。同样,你有两种方法。
使用 Start
和 Stop-Service
如果您想重新启动已启动的服务,您可以使用 Stop-Service
和 Start-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-Service
或 Start-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
列中)。
一旦您知道当前的启动类型,您就可以使用 Set-Service
更改它。
以下示例将启动类型设置为“禁用”。
Set-Service -Name <some service name> -StartupType Disabled
与 Name
和 DisplayName
参数一样,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 循环 - 这对于同时管理许多远程计算机上的服务非常有用。
猜你还喜欢
- 03-30 [玩转系统] 如何用批处理实现关机,注销,重启和锁定计算机
- 02-14 [系统故障] Win10下报错:该文件没有与之关联的应用来执行该操作
- 01-07 [系统问题] Win10--解决锁屏后会断网的问题
- 01-02 [系统技巧] Windows系统如何关闭防火墙保姆式教程,超详细
- 12-15 [玩转系统] 如何在 Windows 10 和 11 上允许多个 RDP 会话
- 12-15 [玩转系统] 查找 Exchange/Microsoft 365 中不活动(未使用)的通讯组列表
- 12-15 [玩转系统] 如何在 Windows 上安装远程服务器管理工具 (RSAT)
- 12-15 [玩转系统] 如何在 Windows 上重置组策略设置
- 12-15 [玩转系统] 如何获取计算机上的本地管理员列表?
- 12-15 [玩转系统] 在 Visual Studio Code 中连接到 MS SQL Server 数据库
- 12-15 [玩转系统] 如何降级 Windows Server 版本或许可证
- 12-15 [玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[影视] 黑道中人 Alto Knights(2025)剧情 犯罪 历史 电影
[古装剧] [七侠五义][全75集][WEB-MP4/76G][国语无字][1080P][焦恩俊经典]
[实用软件] 虚拟手机号 电话 验证码 注册
[电视剧] 安眠书店/你 第五季 You Season 5 (2025) 【全10集】
[电视剧] 棋士(2025) 4K 1080P【全22集】悬疑 犯罪 王宝强 陈明昊
[软件合集] 25年6月5日 精选软件22个
[软件合集] 25年6月4日 精选软件36个
[短剧] 2025年06月04日 精选+付费短剧推荐33部
[短剧] 2025年06月03日 精选+付费短剧推荐25部
[软件合集] 25年6月3日 精选软件44个
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电视剧] 欢乐颂.5部全 (2016-2024)
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[影视] 【稀有资源】香港老片 艺坛照妖镜之96应召名册 (1996)
[剧集] 神经风云(2023)(完结).4K
[剧集] [BT] [TVB] [黑夜彩虹(2003)] [全21集] [粤语中字] [TV-RMVB]
[实用软件] 虚拟手机号 电话 验证码 注册
[资源] B站充电视频合集,包含多位重量级up主,全是大佬真金白银买来的~【99GB】
[影视] 内地绝版高清录像带 [mpg]
[书籍] 古今奇书禁书三教九流资料大合集 猎奇必备珍藏资源PDF版 1.14G
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电影] 美国队长4 4K原盘REMUX 杜比视界 内封简繁英双语字幕 49G
[电影] 死神来了(1-6)大合集!
[软件合集] 25年05月13日 精选软件16个
[精品软件] 25年05月15日 精选软件18个
[绝版资源] 南与北 第1-2季 合集 North and South (1985) /美国/豆瓣: 8.8[1080P][中文字幕]
[软件] 25年05月14日 精选软件57个
[短剧] 2025年05月14日 精选+付费短剧推荐39部
[短剧] 2025年05月15日 精选+付费短剧推荐36部
- 最新评论
-
- 热门tag