Frage

Ich versuche, den folgenden Code zu verwenden, um alle Prozesse auf einem Computer gestartet zu schreiben. Mein Problem ist, dass die EventArrived Methode ein EventArrivedEventArgs geben wird, die eine newEvent Eigenschaft des Typs Managementbase hat. Dies stellt keine InvokeMethod Methode haben. Kann ich die newEvent Eigenschaft auf einen Managementobject einige, wie konvertieren, oder muss ich erneut abfragen und ein Managementobject erstellen? Der folgende Code funktioniert gut, aber möchte nicht erneut abfragen.

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
War es hilfreich?

Lösung

IST das Objekt eine ManagementObject Instanz? Der Indexer kann den Rückgabewert als Base geben, da es sich um eine Allzweck Eigenschaft ist. Versuchen Sie folgendes:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top