使用多个用户按路径而不是名称检索进程的PID

时间:2012-10-09 13:50:27

标签: vbscript path admin pid

我正在尝试检索特定位置的软件的所有实例的PID。它是一个便携式应用程序,因此系统中可能有多个副本,但我只对一个特定位置感兴趣。此外,它可以由不同的用户同时启动,管理员和标准用户。

我复制了这个VBS代码(来自http://msdn.microsoft.com/en-us/library/windows/desktop/aa394372%28v=vs.85%29.aspx

strComputer = "."

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colProcesses = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'foobar.exe'")

For Each objProcess in colProcesses
    If objProcess.GetOwner(User, Domain) = 0 Then
        WScript.Echo "Process " & objProcess.Name & " belongs to " & Domain & "\" & User
    Else
        WScript.Echo "Problem " & Rtn & " getting the owner for process " & objProcess.Caption
    End If
Next

我现在需要区分应用程序的完整路径。如果我使用objProcess.ExecutablePath(第5行),我可以看到当前用户启动的实例的完整路径,而使用Where ExecutablePath(第3行)则会显示某种情况语法错误。

任何帮助?

1 个答案:

答案 0 :(得分:4)

作为documented,您需要管理员权限(更具体地说是SeDebugPrivilege)才能看到其他用户的流程。

使用Where ExecutablePath = '...'子句时遇到的语法错误可能是因为您没有在路径中转义反斜杠。 WMI中的反斜杠查询具有特殊含义的escape个字符,因此您需要将它们加倍以获得字面反斜杠:

Select * From Win32_Process Where ExecutablePath = 'C:\\Windows\\notepad.exe'

我只是在这里猜测,因为你决定省略使用Where子句的实际查询及其引发的错误。