使用 PowerShell 修复有关 Services.msc 或服务的问题

Fixing an issue regarding Services.msc or Services with PowerShell

提问人:ByteSize 提问时间:11/10/2023 最后编辑:ByteSize 更新时间:11/13/2023 访问量:20

问:

除了我的问题之外,如果可能的话,我希望对特殊的 Windows 服务应用程序有一些见解,以防我没有正确理解这一切是如何工作的。谢谢。


上下文:
我正在编写一个 PowerShell 脚本,该脚本手动创建 Windows 服务,并删除或清理它(如果存在)。我的脚本尝试事先停止服务。

问题:
当我在 PowerShell 脚本中创建和删除服务时,它们可能会被打开的服务应用程序阻止

我认为潜在的解决方案可能是

  • 获取 sc.exe 创建和删除命令以通过 PowerShell 完全完成服务的删除和创建,而不仅仅是标记
  • 能够正确检查 Services.msc 或 Services 是否打开(在任务栏上处于活动状态)

任何帮助都是值得赞赏的!

我想先说我可能会将结果与sc.exe创建和删除混淆,但无论哪种方式,我相信我在这里遇到了问题。

到目前为止,我已决定尝试检查服务应用程序是否打开,但无法使其正常工作。根据我创建和删除 Windows 服务的经验,我让这个应用程序阻止了在 PowerShell 中运行这些命令的功能。一个例子是(sc.exe delete “SomeService”)给出反馈,例如“x 被标记为删除”,但不会删除它,例如,直到它关闭或服务本身停止。

我也尝试过杀死服务的任务或进程,但不确定我是否能做到这一点。我无法绕过它的权限。

PowerShell Shell 终端 Windows 服务

评论

0赞 Douda 11/10/2023
只是值得深思,但是在您的脚本中,您不能在修改服务之前查找特定进程(来自您的服务的进程)并杀死它们吗?示例: - 进程是否正在运行?- 如果是这样,请停止服务 - 仍在运行?如果是这样,请杀死它 - 修改您的服务
0赞 ByteSize 11/13/2023
感谢您的回复。在我的脚本中,我确实尝试停止该服务,但我注意到有时它无法正确删除它。我想知道 stop 命令是否可能需要停止以处理停止,以便之后立即删除它?不知道为什么,但我并不总是能够让脚本在这次检查后正确删除服务。这也是为什么我得出的结论是,服务应用程序本身是由于打开而导致问题的。
0赞 Douda 11/15/2023
根据我的经验,当您无法删除服务时,这是因为链接进程仍处于运行状态(例如,这就是为什么您在尝试停止服务时从 MMC 获得较长的等待时间的原因)。我的大多数链接到服务的自动化脚本都会在服务删除之前强制终止进程,这样就可以了。不过不一定是最佳实践

答:

0赞 Douda 11/10/2023 #1

正如评论中提到的,这里有一个可能适合您的片段

# Set the name of the service and process to check for
$serviceName = "Application1Service"
$processName = "application1.exe"

# Check if the service is running
if (Get-Service $serviceName -ErrorAction SilentlyContinue | Where-Object {$_.Status -eq "Running"}) {
    # Stop the service
    Stop-Service $serviceName

    # Check if the process is running
    if (Get-Process $processName -ErrorAction SilentlyContinue) {
        # Kill the process
        Stop-Process -Name $processName -Force
    }

    # Delete the service (CmdLet available from Powershell 6.0)
    Remove-Service $serviceName
}