【问题标题】:Convert .Net ManagementBaseObject to ManagementObject将 .Net ManagementBaseObject 转换为 ManagementObject
【发布时间】:2009-06-22 18:25:04
【问题描述】:

我正在尝试使用以下代码写出在计算机上启动的所有进程。我的问题是 EventArrived 方法传递了一个 EventArrivedEventArgs,它具有类型 ManagementBaseObject 的 NewEvent 属性。这没有 InvokeMethod 方法。我可以通过某种方式将 NewEvent 属性转换为 ManagementObject,还是需要重新查询并创建 ManagementObject?下面的代码效果很好,但不想重新查询。

Imports System.Management

Public NotInheritable Class EntryPoint

    Public Shared Sub Main(ByVal args() As String)

        Dim scope As New ManagementScope("\\.\root\cimV2")
        Dim query As New WqlEventQuery("__InstanceCreationEvent", TimeSpan.FromSeconds(1), "TargetInstance isa ""Win32_Process""")

        Using watcher As New ManagementEventWatcher(scope, query)
            AddHandler watcher.EventArrived, AddressOf EventArrived
            watcher.Start()
            Console.WriteLine("Waiting for processes to start...")
            Console.ReadLine()
            watcher.Stop()
        End Using

    End Sub

    Private Shared Sub EventArrived(ByVal sender As Object, ByVal e As EventArrivedEventArgs)

        Dim targetInstance As ManagementBaseObject = e.NewEvent("TargetInstance")
        Dim process As New ManagementObject("win32_process.handle=" + targetInstance("ProcessId").ToString())
        Dim output(1) As String
        process.InvokeMethod("GetOwner", output)
        Console.WriteLine("Process {0} started by {2}\{1}", targetInstance("Name"), output(0), output(1))

    End Sub

End Class

【问题讨论】:

    标签: .net wmi


    【解决方案1】:

    IS 对象是ManagementObject 实例?索引器可以将返回值作为Base 传递,因为它是一个通用属性。试试这个:

    Private Shared Sub EventArrived(ByVal sender As Object, ByVal e As EventArrivedEventArgs)
        Dim targetInstance As ManagementBaseObject = e.NewEvent("TargetInstance")
    
        If TypeOf targetInstance Is ManagementObject Then
            Dim mo as ManagementObject = DirectCast(targetInstance, ManagementObject)
            Dim output(1) as String
    
            mo.InvokeMethod("GetOwner", output)
    
            Console.WriteLine("Process {0} started by {2}\{1}", targetInstance("Name"), output(0), output(1))
        End If
    End Sub
    

    【讨论】:

    • 不行... targetInstance 不是 ManagementObject 实例。
    • 在这种情况下,不,不执行另一个查询是不可能的。
    猜你喜欢
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 2016-04-18
    • 2011-11-08
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多