none
C#で独自定義のWMIイベントのプロパティの取得方法について RRS feed

  • 質問

  • おつかれさまです。

    C#のフォームアプリで、自前で定義したWMIイベントのプロパティの取得方法が分からず、ご存じの方がいましたらご教授いただけないでしょうか。

    ■MOFファイル定義

    #pragma namespace ("\\root\\wmi")
    #pragma autorecover
    
    [WMI,
     guid("{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}"),
     Provider("wmiprov"),
     Dynamic] 
    
    class MyWMI_Event : WMIEvent
    {
      [key] string InstanceName;
      boolean Active;
      [WmiDataId(1)] uint32 EventType;
      [WmiDataId(2)] uint32 DataBufferSize;
      [WmiDataId(3),WmiSizeIs("DataBufferSize")] uint8 DataBuffer[];
    };
    

    これをターゲットPC上でmofcompで登録しています。

    ■C#実装

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Management;
    
    namespace MyFormSample
    {
        public partial class MyFormSampleMain : Form
        {
            delegate void UpdateTextDelegate(string text);
            ManagementEventWatcher WmiEventWather;
    
            public MyFormSampleMain()
            {
                InitializeComponent();
                SetWmiEventHandler();
            }
    
            private void SetWmiEventHandler()
            {
                string scope = @"root\wmi";
                string queryString = "SELECT * MyWMI_Event ";
                EventWatcherOptions option = new EventWatcherOptions(null, new TimeSpan(0, 0, 1), 1);
                this.WmiEventWather = new ManagementEventWatcher(scope, queryString, option);
                WmiEventWather.EventArrived += new EventArrivedEventHandler(MyWmiEventHandler);
                WmiEventWather.Start();
            }
    
            public void MyWmiEventHandler(object sender, EventArrivedEventArgs arg)
            {
                ManagementNamedValueCollection ctx = arg.Context as ManagementNamedValueCollection;
                ManagementBaseObject newEvent = arg.NewEvent;
                StringBuilder tmpBuffer = new StringBuilder();
    
                tmpBuffer.AppendLine("[Properties]");
                foreach(PropertyData sysProp in newEvent.Properties)
                {
                    tmpBuffer.Append(sysProp.Name + "=");
                    tmpBuffer.AppendLine(sysProp.Value == null ? "null" : sysProp.Value.ToString());
                }
    
                tmpBuffer.AppendLine("[Qualifier]");
                foreach (QualifierData qualifier in newEvent.Qualifiers)
                {
                    tmpBuffer.Append(qualifier.Name + "=");
                    tmpBuffer.AppendLine(qualifier.Value == null ? "null" : qualifier.Value.ToString());
                }
    
                UpdateTextDelegate updateTextDelegate = new UpdateTextDelegate(UpdateText);
                this.Invoke(updateTextDelegate, new object[] { tmpBuffer.ToString() });
            }
    
            private void UpdateText(string text)
            {
                DumpWmiEventDataDialog dump = new DumpWmiEventDataDialog(text);
                dump.ShowDialog();
            }
        }
    }

    これで、Properties/SystemProperties/Qualifierのような一般的なプロパティは取得できるのですが、自前で作成したMOFで定義したプロパティの取得方法が分かっていません。

    なんとなくプロパティのリストを取得、各プロパティの名前を取得、その名前の値を取得、とやるのではないかとは考えているのですがその方法が分かりません。

    2018年12月11日 4:50

回答