Mgmtclassgen.exe (Management Strongly Typed Class Generator)
Updated: April 2011
The Management Strongly Typed Class Generator tool enables you to quickly generate an early-bound managed class for a specified Windows Management Instrumentation (WMI) class. The generated class simplifies the code you must write to access an instance of the WMI class.
This tool is automatically installed with Visual Studio and with the Windows SDK. To run the tool, we recommend that you use the Visual Studio Command Prompt or the Windows SDK Command Prompt (CMD Shell). These utilities enable you to run the tool easily, without navigating to the installation folder. For more information, see Visual Studio and Windows SDK Command Prompts.
If you have Visual Studio installed on your computer: On the taskbar, click Start, click All Programs, click Visual Studio, click Visual Studio Tools, and then click Visual Studio Command Prompt.
-or-
If you have the Windows SDK installed on your computer: On the taskbar, click Start, click All Programs, click the folder for the Windows SDK, and then click Command Prompt (or CMD Shell).
At the command prompt, type the following:
mgmtclassgen WMIClass [options]
Argument |
Description |
---|---|
WMIClass |
The Windows Management Instrumentation class for which to generate an early-bound managed class. |
Option |
Description |
---|---|
/l language |
Specifies the language in which to generate the early-bound managed class. You can specify CS (C#; default), VB (Visual Basic), MC (Managed Extensions for C++), or JS (JScript) as the language argument. |
/m machine |
Specifies the computer to connect to, where the WMI class resides. The default is the local computer. |
/n path |
Specifies the path to the WMI namespace that contains the WMI class. If you do not specify this option, the tool generates code for WMIClass in the default Root\cimv2 namespace. |
/o classnamespace |
Specifies the .NET namespace in which to generate the managed code class. If you do not specify this option, the tool generates the namespace using the WMI namespace and the schema prefix. The schema prefix is the part of the class name preceding the underscore character. For example, for the Win32_OperatingSystem class in the Root\cimv2 namespace, the tool would generate the class in ROOT.CIMV2.Win32. |
/p filepath |
Specifies the path to the file in which to save the generated code. If you do not specify this option, the tool creates the file in the current directory. It names the class and file in which it generates the class using the WMIClass argument. The name of the class and the file are the same as the name of the WMIClass. If WMIClass contains an underscore character, the tool uses the part of the class name following the underscore character. For example, if the WMIClass name is in the format Win32_LogicalDisk, the generated class and file is named "logicaldisk". If a file already exists, the tool overwrites the existing file. |
/pw password |
Specifies the password to use when logging on to a computer specified by the /m option. |
/u user name |
Specifies the user name to use when logging on to a computer specified by the /m option. |
/? |
Displays command syntax and options for the tool. |
Remarks
Mgmtclassgen.exe uses the ManagementClass.GetStronglyTypedClassCode method. Therefore, you can use any custom code provider to generate code in managed languages other than C#, Visual Basic, and JScript.
Note that generated classes are bound to the schema for which they are generated. If the underlying schema changes, you must regenerate the class if you want it to reflect changes to the schema.
The following table shows how WMI Common Information Model (CIM) types map to data types in a generated class:
CIM type |
Data type in the generated class |
---|---|
CIM_SINT8 |
SByte |
CIM_UINT8 |
Byte |
CIM_SINT16 |
Int16 |
CIM_UINT16 |
UInt16 |
CIM_SINT32 |
Int32 |
SIM_UINT32 |
UInt32 |
CIM_SINT64 |
Int64 |
CIM_UINT64 |
UInt64 |
CIM_REAL32 |
Single |
CIM_REAL64 |
Double |
CIM_BOOLEAN |
Boolean |
CIM_String |
String |
CIM_DATETIME |
DateTime or TimeSpan |
CIM_REFERENCE |
ManagementPath |
CIM_CHAR16 |
Char |
CIM_OBJECT |
ManagementBaseObject |
CIM_IUNKNOWN |
Object |
CIM_ARRAY |
Array of the above mentioned objects |
Note the following behaviors when you generate a WMI class:
It is possible for a standard public property or method to have the same name as an existing property or method. If this occurs, the tool changes the name of the property or method in the generated class to avoid naming conflicts.
It is possible for the name of a property or method in a generated class to be a keyword in the target programming language. If this occurs, the tool changes the name of the property or method in the generated class to avoid naming conflicts.
In WMI, qualifiers are modifiers that contain information to describe a class, instance, property, or method. WMI uses standard qualifiers such as Read, Write, and Key to describe a property in a generated class. For example, a property that is modified with a Read qualifier is defined only with a property get accessor in the generated class. Because a property marked with the Read qualifier is intended to be read-only, a set accessor is not defined.
A numeric property can be modified by the Values and ValueMaps qualifiers to indicate that the property can be set only to specified permissible values. An enumeration is generated with these Values and ValueMaps and the property is mapped to the enumeration.
The WMI uses the term singleton to describe a class that can have only one instance. Therefore, the default constructor for a singleton class will initialize the class to the only instance of the class.
A WMI class can have properties that are objects. When you generate a strongly-typed class for this type of WMI class, you should consider generating strongly-typed classes for the types of the embedded object properties. This will allow you to access the embedded objects in a strongly-typed manner. Note that the generated code might not be able to detect the type of the embedded object. In this case, a comment will be created in the generated code to notify you of this issue. You can then modify the generated code to type the property to the other generated class.
In WMI, the data value of the CIM_DATETIME data type can represent either a specific date and time or a time interval. If the data value represents a date and time, the data type in the generated class is DateTime. If the data value represents a time interval, the data type in the generated class is TimeSpan.
You can alternately generate a strongly-typed class using the Server Explorer Management Extension in Visual Studio .NET.
For more information about WMI, see the Windows Management Instrumentation topic in the Platform SDK documentation.
Examples
The following command generates a managed class in C# code for the Win32_LogicalDisk WMI class in the Root\cimv2 namespace. The tool writes the managed class to the source file at c:\disk.cs in the ROOT.CIMV2.Win32 namespace.
mgmtclassgen Win32_LogicalDisk /n root\cimv2 /l CS /p c:\disk.cs
The following code example shows how to use a generated class programmatically. First, an instance of the class is enumerated and the path is printed. Next, an instance of the generated class to be initialized is created with an instance of WMI. Process is the class generated for Win32_Process and LogicalDisk is the class generated for Win32_LogicalDisk in the Root\cimv2 namespace.
Imports System
Imports System.Management
Imports ROOT.CIMV2.Win32
Public Class App
Public Shared Sub Main()
' Enumerate instances of the Win32_process.
' Print the Name property of the instance.
Dim ps As Process
For Each ps In Process.GetInstances()
Console.WriteLine(ps.Name)
Next ps
' Initialize the instance of LogicalDisk with
' the WMI instance pointing to logical drive d:.
Dim dskD As New LogicalDisk(New _
ManagementPath("win32_LogicalDisk.DeviceId=""d:"""))
Console.WriteLine(dskD.Caption)
End Sub
End Class
using System;
using System.Management;
using ROOT.CIMV2.Win32;
public class App
{
public static void Main()
{
// Enumerate instances of the Win32_process.
// Print the Name property of the instance.
foreach(Process ps in Process.GetInstances())
{
Console.WriteLine(ps.Name);
}
// Initialize the instance of LogicalDisk with
// the WMI instance pointing to logical drive d:.
LogicalDisk dskD = new LogicalDisk(new ManagementPath(
"win32_LogicalDisk.DeviceId=\"d:\""));
Console.WriteLine(dskD.Caption);
}
}
See Also
Reference
ManagementClass.GetStronglyTypedClassCode
System.CodeDom.Compiler.CodeDomProvider
Visual Studio and Windows SDK Command Prompts
Other Resources
Change History
Date |
History |
Reason |
---|---|---|
April 2011 |
Added information about using the Visual Studio and Windows SDK Command Prompts. |
Information enhancement. |