2

我需要检测 Print Spooler 服务是否正在运行。我可以找到 VB.NET 的各种资源(例如,ServiceProcess.ServiceController用于实际操作服务),但 VB6 没有。

有什么方法可以检查 Print Spooler 是否在 VB6 中运行?理想情况下开始它,但没有它我可以生存。

4

3 回答 3

4

我们在 VBA/VB6/VBScript 和命令提示符中使用 wmi。

这列出了进程

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * From Win32_Process")
For Each objItem in colItems
        msgbox objitem.name & " PID=" & objItem.ProcessID & " SessionID=" & objitem.sessionid
'       objitem.terminate
Next

这是键入命令提示符。

wmic process get 

您将看到可以使用 wmic help 获取 VBS 方法/属性

wmic/? wmic进程/?wmic 进程获取/?

所以wmic service get caption,status

所以

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * From Win32_Service")
For Each objItem in colItems
        msgbox objitem.name & " " & objitem.status
Next
于 2015-08-07T11:34:17.233 回答
2

由于只有一个Print Spooler,您可以查询Win32_Service该类以获取单个实例。然后,检查Started属性以确定它是否已启动/运行:

Set objSpooler = GetObject("winmgmts:root\cimv2:Win32_Service.Name='Spooler'")

If objSpooler.Started Then
    MsgBox "Print Spooler is running."
Else
    MsgBox "Print Spooler is NOT running."
End If
于 2015-08-07T13:37:35.513 回答
1

已经发布的两个答案都很好(并且会解决问题),但我只是想回答我自己的问题以合并其他地方给出的答案(由 VBForums.com 上的用户 Bonnie West 提供),因为它提供了一种额外的方法并且可能有用对于发现此问题的其他任何人:

Option Explicit 'In a standard Module

Private Sub Main()
    With CreateObject("Shell.Application")  'Or New Shell if Microsoft Shell Controls And Automation is referenced
        If .IsServiceRunning("Spooler") Then
            .ServiceStop "Spooler", False
        Else
            .ServiceStart "Spooler", False
        End If
    End With
End Sub

资源

于 2015-08-07T15:27:51.953 回答