`
mingzhuer18
  • 浏览: 33185 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一些需要掌握的WMI类

    博客分类:
  • WMI
阅读更多

原网页地址:http://www.codeproject.com/KB/server-management/Intro2WMI2.aspx

Msvm_ComputerSystem

是我们需要掌握的第一个类,这个类代表主机或者虚拟机系统。下面显示了这个类的属性以及方法RequestStateChange 这个方法对管理vm的多种状态非常有用。下面是这个类的定义,它与传统的类的定义方式不同, 因为它采用的是MOF(Managed Object Format).

[Dynamic,
Provider
("VmmsWmiInstanceAndMethodProvider")]class Msvm_ComputerSystem : CIM_ComputerSystem
{
  string   Caption;
  string   Description;
  string   ElementName;
  datetime InstallDate;
  uint16   OperationalStatus[];
  string   StatusDescriptions[];
  string   Status;
  uint16   HealthState = 5;
  uint16   EnabledState;
  string   OtherEnabledState;
  uint16   RequestedState;
  uint16   EnabledDefault = 2;
  datetime TimeOfLastStateChange;
  string   CreationClassName;
  string   Name = "GUID";
  string   PrimaryOwnerName;
  string   PrimaryOwnerContact;
  string   Roles[];
  string   NameFormat;
  string   OtherIdentifyingInfo[];
  string   IdentifyingDescriptions[];
  uint16   Dedicated[];
  string   OtherDedicatedDescriptions[];
  uint16   ResetCapability = 1;
  uint16   PowerManagementCapabilities[];
  uint64   OnTimeInMilliseconds;
  datetime TimeOfLastConfigurationChange;
  uint32   ProcessID;
  uint16   AssignedNumaNodeList[];
};

 

现在,让我们获取一个Msvm_ComputerSystem类的对象,以便于我们能够执行方法RequestStateChange去改变vm的状态。首先让我们来定义一个 帮助程序,这个帮助程序会查询包含这个类的所有的属性和方法的命名空间,这个程序最终会返回一个ManagementObject对象,这个对象可以用来执行改变vm状态的方法。下面是Utility sample里的代码(默认之前已经定义了ManagementScope,此处省去了):

public static ManagementObject GetTargetComputer
(string vmElementName, ManagementScope scope)
{
    string query = string.Format("select * from
    Msvm_ComputerSystem Where ElementName = '{0}'"
, vmElementName);

    ManagementObjectSearcher searcher = new
      ManagementObjectSearcher(scope, new ObjectQuery(query));

    ManagementObjectCollection computers = searcher.Get();

    ManagementObject computer = null;

    foreach (ManagementObject instance in computers)
    {
      computer = instance;
      break;
    }
return computer;
}

 

根据上面的方法,我们可以在程序里编写如下代码调用上面的方法获取Msvm_ComputerSystem 的一个实例:

ManagementObject vm = Utility.GetTargetComputer(vmName, scope);

vm就是我们获取到的Msvm_ComputerSystem实例,然后我们可以调用Msvm_ComputerSystem里的方法“RequestStateChange”,调用WMI类的方法需要用到GetMethodParameters,规则如下:

ManagementBaseObject inParams = vm.GetMethodParameters("RequestStateChange");

输入该方法需要的参数

inParams["RequestedState"] = Enabled;
ManagementBaseObject outParams =
vm.InvokeMethod("RequestStateChange", inParams, null);

if ((UInt32)outParams["ReturnValue"] == ReturnCode.Completed)
   {
     Console.WriteLine("{0} state was
           changed successfully."
, vmName);
    }
    else
    {
      Console.WriteLine("Change virtual system
      state failed with error{0}"
, outParams["ReturnValue"]);
    }

}

 

至此我们已经成功改变了vm的状态,但是有一些问题需要注意,上面的例子里将vm的状态改为Enalbled,但是在这之前并没有检查当前vm是否就是这个状态。要在修改状态前检查vm状态,我们可以参考之前写的一边文章。

除此之外,我们还注意到InvokeMethod不能立即返回成功与否的状态。当vm正在启动的时候(starting),它不能返回已启动状态(started),所以我们应该做个方法等待状态修改完成并报告这个最终执行情况。我们在Utility里定义了一个JobCompleted()方法,来跟踪InvokeMethod方法。

 

if ((UInt32)outParams["ReturnValue"]
          == ReturnCode.Started)
    {
     if (Utility.JobCompleted(outParams, scope))
      {
        Console.WriteLine("{0} state was changed
        successfully."
,   vmName);
      }
      else
      {
        Console.WriteLine("Failed to change
            virtual system state"
);
      }
     }
    else if ((UInt32)outParams["ReturnValue"]
           == ReturnCode.Completed)
     {
        Console.WriteLine("{0} state was
            changed successfully."
, vmName);
     }
     else
     {
      Console.WriteLine("Change virtual
        system state failed with error {0}"
,
        outParams ["ReturnValue"]);
     }

 

 

JobCompleted方法描述如下:

//This code demonstrates how the VM state change can be tracked

public static bool JobCompleted(ManagementBaseObject outParams,
                                ManagementScope scope)
{
    bool jobCompleted = true;

    //Retrieve msvc_StorageJob path. This is a full wmi path
    string JobPath = (string)outParams["Job"];
    ManagementObject Job = new ManagementObject(scope,
    new ManagementPath(JobPath), null);

    //Try to get storage job information
    Job.Get();
    while ((UInt16)Job["JobState"] == JobState.Starting
        || (UInt16)Job["JobState"] == JobState.Running)
    {
        Console.WriteLine("In progress... {0}% completed.",
            Job["PercentComplete"]);
        System.Threading.Thread.Sleep(1000);
        Job.Get();
    }

    //Figure out if job failed
    UInt16 jobState = (UInt16)Job["JobState"];
    if (jobState != JobState.Completed)
    {
        UInt16 jobErrorCode = (UInt16)Job["ErrorCode"];
        Console.WriteLine("Error Code:{0}", jobErrorCode);
        Console.WriteLine("ErrorDescription: {0}",
         (string)Job["ErrorDescription"]);
        jobCompleted = false;
    }
    return jobCompleted;
}

 

 

分享到:
评论

相关推荐

    常用WMI列表

    Windows Management Instrumentation(WMI)是微软开发的一种管理框架,用于提供对Windows操作系统以及...在“常用WMI列表.txt”文件中,很可能包含了这些类的详细描述和使用示例,对于学习和掌握WMI技术非常有帮助。

    非常好用的WMI编程工具(WMITools)

    **WMI(Windows Management Instrumentation)编程工具是IT专业人员在管理系统时不可或缺的资源,而WMITools...通过掌握WMI和WMITools的使用,IT专业人员能更好地应对各种系统管理挑战,提升日常运维的效率和准确性。

    wmi技术指南PDF

    **Windows Management Instrumentation (WMI) 技术指南** Windows Management Instrumentation(WMI)是Microsoft Windows操作系统中的一个...学习和掌握WMI技术,能够极大提升IT专业人员在Windows环境下的工作效率。

    WMI代码创建工具

    **正文** WMI(Windows Management ...掌握WMI代码创建工具,对于提升开发者在系统级编程中的能力具有重要意义。同时,配合.NET框架的其他组件,如ADO.NET进行数据库操作,可以构建出强大的系统管理和监控应用。

    wmi相关说明

    总的来说,WMI接口是Windows系统管理和自动化的重要工具,通过学习和掌握WMI,开发者和系统管理员可以更高效地管理和维护Windows环境。在提供的WMI资料中,可能包含了关于WMI的详细文档、示例代码、教程等内容,可以...

    WmiTools(windows系统工具)

    **WmiTools:Windows系统工具详解** WmiTools是一款针对Windows操作系统的实用工具,它主要利用Windows Management Instrumentation...通过学习和掌握WMI以及WmiTools的使用,可以极大地提升Windows系统的管理效率。

    WMI 代码生成器

    **WMI代码生成器**是一种实用工具,专为开发者设计,能够自动生成针对Windows Management Instrumentation(WMI)接口的代码。...通过熟练掌握WMI和利用代码生成工具,开发者可以更轻松地驾驭这个丰富的管理环境。

    wmi 的使用方法

    总之,WMI是Windows管理员和开发者的重要工具,它提供了丰富的系统管理功能,而理解和掌握WMI的使用方法对于提升自动化和管理效率至关重要。通过不断实践和探索,你将能够充分利用WMI的潜力,解决各种系统管理和维护...

    怎样使用WMI查询

    总的来说,掌握WMI查询对于Windows系统管理员来说是一项必备技能,它极大地提高了管理效率,使得日常的系统维护和问题排查工作更加高效和精确。通过实践和学习,你可以充分利用WMI的强大功能来优化你的IT环境。

    WMI技术大全

    4. **WMI类和实例**:掌握WMI类的概念,它们是WMI对象的蓝图,以及如何实例化这些类来访问或操作特定的系统对象。 5. **管理提供者**:理解不同类型的提供者,如操作系统提供者、硬件提供者和管理工具提供者,以及...

    WMI.rar_wmi_wmi 系统信息

    总的来说,WMI是Windows平台强大的管理系统资源的工具,无论你是系统管理员还是开发者,理解和掌握WMI都能极大地提升你在系统管理和自动化任务中的效率。通过学习“WMI基础知识”,你可以了解到如何使用WMI来获取和...

    MiTeC WMI Explorer 1.0.zip

    掌握WMI Explorer的使用,意味着能够更有效地管理和诊断Windows环境。通过实践和学习,可以深入了解WMI类的结构,提高系统管理效率。同时,了解WMI对于系统管理员、开发者和IT专业人员来说,都是提升技能的重要途径...

    WMI Delphi Code Creator

    9. **提高效率**: 对于需要频繁与WMI交互的项目,使用WMI Delphi Code Creator可以大大减少手动编码的时间,让开发者更专注于业务逻辑和用户体验设计。 10. **维护和更新**: 由于WMI接口可能会随着新的Windows更新...

    使用wmi查询显示设备信息

    总之,WMI是Windows系统管理的强大工具,通过熟练掌握WMI查询,我们可以方便地获取和操作各种设备信息,提高管理效率。在日常开发和运维工作中,掌握WMI的使用技巧,无疑会极大地提升工作效率。

    window高级编程之WMI编程应用

    ### Window高级编程之WMI编程应用 #### 12.1 WMI技术基础...无论是对于系统管理员还是开发者而言,掌握WMI都是提高工作效率的有效手段。通过WMI,可以轻松实现对系统状态的监控、资源的管理和自动化任务的执行等功能。

    WMI信息Class代码生成器WMIclass[WMIclass.rar]-精品源代码

    1. 用户通过界面输入或选择需要查询的WMI类或实例。 2. 工具使用WMI API(如`SWbemLocator`和`SWbemServices`对象)连接到本地或远程的WMI服务,执行查询。 3. 查询结果被解析,并根据结果结构自动生成对应的类代码...

    wmi查询工具

    **WMI查询工具详解** Windows Management Instrumentation(WMI)是微软提供的一个核心系统组件,它为管理系统提供了统一的接口...对于系统管理员和自动化任务编写者,掌握WMI查询和工具的使用是提升工作效率的关键。

    如何使用WMI查询处理器信息

    在Windows操作系统中,WMI(Windows Management Instrumentation)是一个强大的管理工具,用于获取和操作系统的各种信息,包括硬件、软件和服务等...对于IT专业人士来说,熟练掌握WMI的使用是提升工作效率的重要手段。

    C++调用WMI遍历进程

    在IT领域,Windows Management Instrumentation(WMI)是Windows操作系统提供的一个核心组件,它允许应用程序...通过这样的实践,你不仅能掌握WMI的基本用法,还能了解到如何将WMI技术应用于实际的系统管理和监控场景。

    WMI查询操作系统.rar

    **WMI查询操作系统** Windows Management Instrumentation(WMI)是微软提供的一种管理和配置...通过理解和掌握这些WMI查询操作系统的知识点,开发者可以更有效地管理Windows环境,提升系统的可维护性和稳定性。

Global site tag (gtag.js) - Google Analytics