سؤال

وأنا أحاول أن استخدام التعليمات البرمجية التالية لكتابة بدأت جميع العمليات على جهاز كمبيوتر. مشكلتي هي أن طريقة 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