Question

J'essaie d'utiliser le code suivant pour écrire tous les processus démarrés sur un ordinateur. Mon problème est que la méthode EventArrived reçoit un EventArrivedEventArgs qui a une propriété NewEvent de type ManagementBaseObject. Cela n'a pas de méthode InvokeMethod. Puis-je convertir la propriété NewEvent en un objet ManagementObject, ou dois-je requérir une nouvelle requête et créer un objet ManagementObject? Le code ci-dessous fonctionne très bien, mais ne souhaite pas requery.

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
Était-ce utile?

La solution

EST l'objet une instance ManagementObject ? L'indexeur peut transmettre la valeur de retour sous la forme Base , car il s'agit d'une propriété générique. Essayez ceci:

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top