Converter .Net ManagementBaseObject para ManagementObject
Pergunta
Eu estou tentando usar o seguinte código para escrever todos os processos iniciados em um computador. Meu problema é que o método EventArrived é passado um EventArrivedEventArgs que tem uma propriedade NewEvent do tipo ManagementBaseObject. Isto não tem um método InvokeMethod. Posso converter a propriedade NewEvent a um ManagementObject de alguma forma, ou que eu preciso para repetir a consulta e criar um ManagementObject? O código abaixo funciona muito bem, mas gostaria de não repetir a consulta.
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
Solução
é o objeto uma instância ManagementObject
? O indexador pode passar o valor de retorno como um Base
porque é uma propriedade de uso geral. Tente isto:
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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow