Преобразование .Net ManagementBaseObject в ManagementObject

StackOverflow https://stackoverflow.com/questions/1028710

  •  06-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь использовать следующий код для записи всех процессов, запущенных на компьютере. Моя проблема заключается в том, что метод EventArrived передается EventArrivedEventArgs, который имеет свойство NewEvent типа ManagementBaseObject. У этого нет метода InvokeMethod. Могу ли я каким-то образом преобразовать свойство NewEvent в ManagementObject или мне нужно запросить и создать 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
Это было полезно?

Решение

ЕСТЬ объект является экземпляром ManagementObject ? Индексатор может передать возвращаемое значение как Base , потому что это свойство общего назначения. Попробуйте это:

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top