How to publish wmi classes in .net?

Question :

How to publish wmi classes in .net?,

Answer :

I’ve created a seperate assembly with a class that is intended to be
published through wmi. Then I’ve created a windows forms app that
references that assembly and attempts to publish the class. When I try to
publish the class, I get an exception of type
System.Management.Instrumentation.WmiProviderInstallationException. The
message of the exception says “Exception of type
‘System.Management.Instrumentation.WMIInfraException’ was thrown.”. I have
no idea what this means. I’ve tried .Net2.0 and .Net3.5 (sp1 too) and get the same results.

Below is my wmi class, followed by the code I used to publish it.

//Interface.cs in assembly WMI.Interface.dll    using System;  using System.Collections.Generic;  using System.Text;    [assembly: System.Management.Instrumentation.WmiConfiguration(@"rootTest",      HostingModel =   System.Management.Instrumentation.ManagementHostingModel.Decoupled)]    namespace WMI  {      [System.ComponentModel.RunInstaller(true)]      public class MyApplicationManagementInstaller :          System.Management.Instrumentation.DefaultManagementInstaller { }        [System.Management.Instrumentation.ManagementEntity(Singleton = true)]      [System.Management.Instrumentation.ManagementQualifier("Description",          Value = "Obtain processor information.")]      public class Interface      {          [System.Management.Instrumentation.ManagementBind]          public Interface()          {          }            [System.Management.Instrumentation.ManagementProbe]          [System.Management.Instrumentation.ManagementQualifier("Descriiption",              Value="The number of processors.")]          public int ProcessorCount          {              get { return Environment.ProcessorCount; }          }      }  }  

 

//Button click in windows forms application to publish class  try  {      System.Management.Instrumentation.InstrumentationManager.Publish(new   WMI.Interface());  }  catch (System.Management.Instrumentation.InstrumentationException   exInstrumentation)  {      MessageBox.Show(exInstrumentation.ToString());  }  catch (System.Management.Instrumentation.WmiProviderInstallationException   exProvider)  {      MessageBox.Show(exProvider.ToString());  }  catch (Exception exPublish)  {      MessageBox.Show(exPublish.ToString());  }

,

To summarize, this is the final code that works:

Read More  Printing in Adobe AIR – Standalone PDF Generation

Provider class, in it’s own assembly:

// the namespace used for publishing the WMI classes and object instances   [assembly: Instrumented("root/mytest")]    using System;  using System.Collections.Generic;  using System.Text;  using System.Management;  using System.Management.Instrumentation;  using System.Configuration.Install;  using System.ComponentModel;    namespace WMITest  {        [InstrumentationClass(System.Management.Instrumentation.InstrumentationType.Instance)]       //[ManagementEntity()]      //[ManagementQualifier("Description",Value = "Obtain processor information.")]      public class MyWMIInterface      {          //[System.Management.Instrumentation.ManagementBind]          public MyWMIInterface()          {          }            //[ManagementProbe]          //[ManagementQualifier("Descriiption", Value="The number of processors.")]          public int ProcessorCount          {              get { return Environment.ProcessorCount; }          }      }        ///       /// This class provides static methods to publish messages to WMI      ///       public static class InstrumentationProvider      {          ///           /// publishes a message to the WMI repository          ///           /// the message text          /// the message type          public static MyWMIInterface Publish()          {              // create a new message              MyWMIInterface pInterface = new MyWMIInterface();                Instrumentation.Publish(pInterface);                return pInterface;          }            ///           /// revoke a previously published message from the WMI repository          ///           /// the message to revoke          public static void Revoke(MyWMIInterface pInterface)          {              Instrumentation.Revoke(pInterface);          }              }        ///       /// Installer class which will publish the InfoMessage to the WMI schema      /// (the assembly attribute Instrumented defines the namespace this      /// class gets published too      ///       [RunInstaller(true)]      public class WMITestManagementInstaller :          DefaultManagementProjectInstaller      {      }  }  

Windows forms application main form, publishes provider class:

using System;  using System.Collections.Generic;  using System.ComponentModel;  using System.Data;  using System.Drawing;  using System.Text;  using System.Windows.Forms;  using System.Management;  using System.Management.Instrumentation;    namespace WMI  {      public partial class Form1 : Form      {          public Form1()          {              InitializeComponent();          }            WMITest.MyWMIInterface pIntf_m;            private void btnPublish_Click(object sender, EventArgs e)          {              try              {                  pIntf_m = WMITest.InstrumentationProvider.Publish();              }              catch (ManagementException exManagement)              {                  MessageBox.Show(exManagement.ToString());              }              catch (Exception exPublish)              {                  MessageBox.Show(exPublish.ToString());              }          }      }  }  

Test web application, consumer:

using System;  using System.Data;  using System.Configuration;  using System.Web;  using System.Web.Security;  using System.Web.UI;  using System.Web.UI.WebControls;  using System.Web.UI.WebControls.WebParts;  using System.Web.UI.HtmlControls;  using System.Management.Instrumentation;  using System.Management;    public partial class _Default : System.Web.UI.Page   {      protected void Page_Load(object sender, EventArgs e)      {          if (!IsPostBack)          {              ManagementClass pWMIClass = null;                pWMIClass = new ManagementClass(@"rootinteriorhealth:MyWMIInterface");                lblOutput.Text = "ClassName: " + pWMIClass.ClassPath.ClassName + "
" + "IsClass: " + pWMIClass.ClassPath.IsClass + "
" + "IsInstance: " + pWMIClass.ClassPath.IsInstance + "
" + "IsSingleton: " + pWMIClass.ClassPath.IsSingleton + "
" + "Namespace Path: " + pWMIClass.ClassPath.NamespacePath + "
" + "Path: " + pWMIClass.ClassPath.Path + "
" + "Relative Path: " + pWMIClass.ClassPath.RelativePath + "
" + "Server: " + pWMIClass.ClassPath.Server + "
"; //GridView control this.gvProperties.DataSource = pWMIClass.Properties; this.gvProperties.DataBind(); //GridView control this.gvSystemProperties.DataSource = pWMIClass.SystemProperties; this.gvSystemProperties.DataBind(); //GridView control this.gvDerivation.DataSource = pWMIClass.Derivation; this.gvDerivation.DataBind(); //GridView control this.gvMethods.DataSource = pWMIClass.Methods; this.gvMethods.DataBind(); //GridView control this.gvQualifiers.DataSource = pWMIClass.Qualifiers; this.gvQualifiers.DataBind(); } } }

That’s the answer How to publish wmi classes in .net?, Hope this helps those looking for an answer. Then we suggest to do a search for the next question and find the answer only on our site.

Read More  ILMerge Best Practices

Disclaimer :

The answers provided above are only to be used to guide the learning process. The questions above are open-ended questions, meaning that many answers are not fixed as above. I hope this article can be useful, Thank you