从WMI进程获取运行的应用程序实例?

时间:2015-11-28 15:46:10

标签: vbscript wmi office-automation

我正试图抓住MS Access 2010+的运行实例(在Win10上),但是通常的提示; GetObject(, "Access.Application") ...仅适用于我自己用脚本启动的隐藏实例,但用户从GUI启动的任何实例。

是的,在WMI和GetObject上,我已经阅读过10个或更多关于这个主题的谷歌点击,但我似乎错过了一些重要的东西。

但是,我已经尝试了下面的代码,我可以用这种方式获取运行Access实例的任何进程,我甚至可以.terminate()它们,但是,这是我想做什么。相反,我想抓住进程并将其分配给可用的(正确类型)Access变量(请参阅下面代码中的“OutInstance”):

[ 编辑 :使用WHERE子句,并跳过Exit以检索最后一个实例]

Public Function GetRunningInstance(sAppName sComputer, ByRef OutInstance)
    Dim oWMIService
    Dim wProcesses
    Dim oPrc

    GetRunningInstance = False
    Set OutInstance = Nothing

    if sComputer = "" then sComputer = "."
    Set oWMIService = GetObject("winmgmts:" & "{impersonationLevel=" & _
        "impersonate}!\\" & sComputer & "\root\cimv2")
    Set wProcesses = oWMIService.ExecQuery ("SELECT * FROM Win32_Process " & _
        "WHERE Name = '" & sAppName & "'")

    For Each oPrc in wProcesses
            ''' oPrc.Terminate()      ''' Works, I can shut down Access...
            Set OutInstance = oPrc
            GetRunningInstance = True 
            ''' By not exiting we get the last instance.
    Next

End Function

现在,在尝试获取实例后,如何将流程“转换”为此VBScript中可用的Access应用程序变量?

Sub Test_DoStuff()
    Dim InstProc
    Dim AccessApp

    If GetRunningInstance("msaccess.exe", "127.0.0.1", InstProc) Then
        Set AccessApp = ''' cast 'InstProc' to my "Access.Application" somehow?
    Else 
        Set AccessApp = CreateObject("Access.Application")
    End If

    ''' 
    ''' Doing my stuff
    ''' 

    AccessApp.CloseCurrentDatabase
    AccessApp.DoCmd.Quit
End Sub

Test

我(也)不明白为什么GetObject(, "Access.Application")在所有情况下都不起作用。权限? (我知道关闭当前用户正在使用的数据库是“不安全的”,但也可以处理)。

// Rolf

0 个答案:

没有答案