Convertir .Net ManagementBaseObject en objet de gestion
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
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