2009-06-22 6 views
1

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 est passée à un EventArrivedEventArgs qui a une propriété NewEvent de type ManagementBaseObject. Cela n'a pas une méthode InvokeMethod. Puis-je convertir la propriété NewEvent en ManagementObject d'une certaine manière, ou dois-je requery et créer un ManagementObject? Le code ci-dessous fonctionne très bien, mais ne voudrait pas actualiser.Convertir .Net ManagementBaseObject en 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 

Répondre

2

IS l'objet d'une instance ManagementObject? L'indexeur peut transmettre la valeur de retour sous la forme Base car il s'agit d'une propriété à usage général. 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 
+1

Non aller ... targetInstance n'est pas une instance ManagementObject. –

+0

Dans ce cas, non, il n'est pas possible de faire sans exécuter une autre requête. –

Questions connexes