如何使用 Powershell 查找、停止和禁用 Windows 服务

Raf*_*fiq 3 windows powershell service

我试图找到一项服务,停止它,然后使用 Powershell 远程禁用它。它可以找到并停止,但不能禁用。为了禁用,我必须Set-Service单独运行命令。可以在一行中完成吗?

以下代码片段将停止Print Spooler服务,但不会禁用它:

$ip = "10.10.10.10"
$svc_name = "Spooler"
get-service -ComputerName $ip | Where-Object {$_.Name -eq $svc_name} |  Stop-Service | Set-Service -StartupType  Disabled
Run Code Online (Sandbox Code Playgroud)

以下代码片段将停止并禁用Print Spooler服务:

$ip = "10.10.10.10"
$svc_name = "Spooler"
get-service -ComputerName $ip | Where-Object {$_.Name -eq $svc_name} |  Stop-Service
Set-Service $svc_name -StartupType  Disabled
Run Code Online (Sandbox Code Playgroud)

Powershell 版本是5.1.14393.2969.

编辑: 以下行也将查找和禁用。所以,看起来我可以用管道给出两条指令。

get-service -ComputerName $ip | Where-Object {$_.Name -eq $svc_name} | Set-Service -StartupType  Disabled
Run Code Online (Sandbox Code Playgroud)

Ben*_*est 7

您需要使用Set-Service来设置启动类型,如您的问题所述:

Set-Service -StartupType Disabled $svc_name
Run Code Online (Sandbox Code Playgroud)

如果您想在“一行”中执行此操作,则可以使用-PassThru参数 onStop-Service返回服务对象,然后可以将其发送到管道中(您也不需要Where-Object子句,Get-Service也可以过滤服务名称):

Get-Service -ComputerName $ip $svc_name | Stop-Service -PassThru | Set-Service -StartupType Disabled
Run Code Online (Sandbox Code Playgroud)

您在原始问题中已经接近了这一点,但它不起作用,因为您没有使用-PassThruon 参数Stop-Service。需要注意的是,许多默认情况下不返回对象的 cmdlet 确实包含一个-PassThru参数来返回一个可以在必要时进一步处理的对象,这并不限于Stop-Service任何方式。