2014年2月28日星期五

[][C#] 利用 WMI 控制 远程/本端 计算机 -- 以关机为例

本文自动转发自我的博客: http://www.haofengjing.org/?p=1596
=================================== * 问题描述 * =================================== 如何使用 WMI 达到 远程 及 本端计算机的控制 ( 重新启动及关机 ) =================================== * 范例程序 — 示意图 * =================================== =================================== * 范例程序 — 程序代码 * =================================== //====================================== // 本程序制作 : Nobel12 ( 轧延油 ) // 程序解说网址 : http://www.wretch.cc/blog/nobel12 // 制作日期: 2009/06/22 // 相关参考网址:[ 下方格式 >>> 网站名称 , 文章主题 , 引用网址 ] // * 制作起源: .NET菜鸟自救会, [C#]取得CPU温度 , http://www.dotblogs.com.tw/chou/archive/2009/06/21/8927.aspx // 参考网址1: MSDN, ManagementObjectSearcher 成员 , http://msdn.microsoft.com/zh-tw/library/system.management.managementobjectsearcher_members.aspx // 参考网址2: 强力鎯头 の VB 部落 , C# 透过 WMI 控制计算机重新启动 , http://itgroup.blueshop.com.tw/HammerChou/PowerHammer?n=convew&i=2408 // 参考网址3: 开发者在线 - www.builder.com.cn , Visual C#中用WMI控制远程计算机 , http://www.builder.com.cn/2007/1111/624415.shtml // 参考网址4: MSDN 社群论坛 , 使用WMI操控远程计算机联机失败 , http://social.msdn.microsoft.com/Forums/zh-TW/233/thread/d8606179-f6c3-4516-9a2e-9711b0d08642 // 参考网址5: MSDN 社群论坛 , WMI远程计算机的ConnectionOptions类别的疑问 , http://social.msdn.microsoft.com/Forums/zh-TW/233/thread/dd06d6a3-f16a-4409-a01b-143e85294da8 //====================================== using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; // 请先加入参考 System.Management,再加入 using System.Management using System.Management; namespace FrmWMISample { public partial class FrmRebootbyWMI : Form { public FrmRebootbyWMI() { InitializeComponent(); } // 本机端部份 private void btnLocalReboot_Click(object sender, EventArgs e) { // 使用 ManagementClass 类别 --> 表示 CIM (通用信息模型) 管理类别, 管理类别是指 WMI 类别, // 关于 CIM 可参考: http://technet.microsoft.com/zh-tw/library/aa998751.aspx ManagementClass mc_os = new ManagementClass("Win32_OperatingSystem"); // ConnectionOptions.EnablePrivileges 属性 : 指出是否需要为连接作业启用用户权力。 **(特一) // 如果需要为连接作业启用用户权力,应为 true,否则为 false。默认值为 false。 // 执行的作业需要启用某些用户权力时 (如,计算机重新启动) 应该使用这个属性。 mc_os.Scope.Options.EnablePrivileges = true; // 透过 foreach 语句把集合体中之元素分别取出 foreach (ManagementObject mo in mc_os.GetInstances()) { // 使用 InvokeMethod 方法叫用 重新启动 mo.InvokeMethod("Reboot", null, null); } // 释放资源 mc_os.Dispose(); } // 可指定远程计算机部份 private void btnRemoteExecute_Click(object sender, EventArgs e) { // 确立 WMI 运作范围 // 使用 ConnectionOptions 类别对象来设定关连线设定 ConnectionOptions options = new ConnectionOptions ( ) ; options.Username = txtUsername.Text ; // 使用者名称 options.Password = txtPassword.Text ; // 用户密码 options.Authentication = AuthenticationLevel.Default; // 认证模式设定 (采用默认) options.Impersonation = ImpersonationLevel.Impersonate; // 设定 COM 仿真等级 options.EnablePrivileges = true; // 参考 **(特一) //options.Authority = "ntdlmdomain:DOMAIN"; try { // 使用 ManagementScope 类别 ManagementScope MS_Conn = new ManagementScope("\\\\" + txtName.Text + "\\root\\cimv2", options); MS_Conn.Connect(); // 建立 WMI 查询条件 ( 此类 SQL 语法 ) // 可参考 : [以下格式 : 文章名称 , 引用网址 ] // WMI脚本高手不完全手册 , http://forum.slime.com.tw/thread170813.html // .net中的WMI编程(一):WMI介绍及简单应用 , http://soft.zdnet.com.cn/software_zone/2008/0114/708068.shtml ObjectQuery oq = new ObjectQuery("SELECT * FROM Win32_OperatingSystem"); ManagementObjectSearcher mos1 = new ManagementObjectSearcher(MS_Conn, oq); ManagementObjectCollection moc1 = mos1.Get(); foreach (ManagementObject mo in moc1) { if (comboBox1.Text =="重新启动") { mo.InvokeMethod ( "Reboot" , null ) ; MessageBox.Show(string.Format("计算机: {0} 已重新启动...", txtName.Text)); } else if ( comboBox1.Text =="关机") { mo.InvokeMethod ( "Shutdown" , null ) ; MessageBox.Show(string.Format("计算机: {0} 已关机...", txtName.Text)); } else { MessageBox.Show("例外错误!!!"); } } } catch ( Exception err1 ) { MessageBox.Show ( "与 " + txtName.Text + " 联机错误,错误讯息为:" + err1.Message ) ; } } private void FrmRebootbyWMI_Load(object sender, EventArgs e) { comboBox1.SelectedIndex = 0; } } }

[]C#中操作WMI的类库-实现远程登录共享

本文自动转发自我的博客: http://www.haofengjing.org/?p=1595

WMI是Windows Management Instrumentation的简称,即:视窗管理规范。在Windows 2000或以后的版本中均安装得有,NT4.0则需要安装WMI的核心组件。通过WMI可以获取远程计算机的各种数据信息,控制远程计算机的各种行为,而这就像操作本地机一样方便、简单。

  一.WMI简介 
  WMI从根本上说应该为一种服务,并且对于本地不同的用户,WMI所有的权限也不一样。计算机超级用户可以为计算机中的每一个用户,设定不同的WMI权限。在默认状态下,超级用户拥有WMI的一切权限。提供WMI服务是通过程序"WinMgmt.exe"来实现的。可以从"System32\Wbem"目录中找到这个文件。

  既然是服务,计算机使用者就可以享受这种服务,同样也可以关闭这种服务。具体的操作是:按顺序打开【控制面板】|【管理工具】|【组件服务】。WMI服务在组件服务中的显示名称为"Windows Management Instrumentation"。具体如下图01所示:

VisualC#中用WMI编写网络应用程序
图01:组件服务窗口


  选中【名称】栏中"Windows Management Instrumentation",点击鼠标右键,在弹出的菜单中,选择【属性】,在【启动类型】选择框中选择"已禁用",然后在单击【停止】按钮,这样本地的WMI服务也就被关闭了。此时所有本地和远程的WMI调用均为非法。下图为关闭WMI服务后的界面:

VisualC#中用WMI编写网络应用程序
关闭WMI服务


  计算机的超级用户在默认状态下拥有WMI的一切权限,并且可以为本地其他用户设置WMI权限。具体操作是,按顺序打开:【控制面板】|【管理工具】|【计算机管理】。选中【计算机管理】右边的【服务和应用程序】中的【WMI控件】。具体如图02所示:

VisualC#中用WMI编写网络应用程序
图02:【计算机管理】对话框


  点击鼠标右键,在弹出的菜单中,选择【属性】。弹出【WMI控件属性】对话框中,选择【安全】页面。具体如图03所示:

VisualC#中用WMI编写网络应用程序
图03: 打开WMI安全设置界面


  单击图9-4中【安全设置】按钮,弹出【安全设置Root】对话框,通过其中的【添加】和【删除】按钮,可以设定本地有哪些用户拥有WMI权限,并通过【权限】选择栏为每一个用户设置不同的权限,具体如图04所示:

VisualC#中用WMI编写网络应用程序
图04:设定本地用户的WMI权限


  通过上图,也可以发现计算机超级用户在默认状态的WMI权限都是允许的,并且这些权限都是无法删除的。


二.Visual C#中操作WMI的类库简介
  .Net FrameWork SDK对WMI提供了全面的支持,.Net FrameWork SDK为Visual C#能够操作WMI提供了一个专门的命名空间"System.Management"。在命名空间"System.Management"中提供了大量用以处理和WMI相关的类、接口和枚举。

  命名空间"System.Management"中的成员是非常复杂的,由于篇幅所限完全介绍这些成员是不可能的,也是没有要的。根据我的经验,认为要了解、掌握在Visual C#中使用WMI,下面六个类应该是学习的重点,分别是ConnectionOptions、ManagementScope、ObjectQuery、ManagementObjectSearcher、ManagementObjectCollection和ManagementObject。下面就简单介绍一下六个类:

  ·ConnectionOptions类

  ConnectionOptions类主要的功能是为建立的WMI连接提供所需的所有设置。在利用WMI对远程计算机进行操作的时候,首先要进行WMI连接,WMI连接主要是使用的是ManagementScope 类,成功完成WMI连接就要提供远程计算机WMI用户名和口令。ConnectionOptions类可以通过其属性来提供这些信息。表01是ConnectionOptions类的一些主要属性及其简单的说明。

属性 说明
Authority 获取或设置将用于验证指定用户的权利。
Locale 获取或设置将用于连接操作的区域设置。
Password 提供用于WMI连接操作的口令。
Username 提供用于WMI连接操作的用户名。

     表01:ConnectionOptions类常用属性及其说明

  其中最常用的属性是Password和Username。

  ·ManagementScope 类

  通过ManagementScope类能够建立和远程计算机(或者本地计算机)的WMI连接,表示管理可操作范围。创建WMI连接可以通过二种方法:

  ( 1 ) . 利用构造函数,当使用下面构造函数初始化ManagementScope 类实例,同时也就建立了WMI连接,具体如下:

public ManagementScope (  string path , ConnectionOptions options ) ;


  参数:

  path ManagementScope的服务器和命名空间。 

  options 包含有关连接的选项的 ConnectionOptions。

  使用构造函数是有风险的,因为如果不能根据提供的选项建立WMI连接,程序会程序异常,出现错误。 

  下列代码是利用此构造函数构建建立ManagementScope实例,并建立于远程计算机majinhu的WMI连接:

System.Management.ConnectionOptions Conn = new ConnectionOptions ( ) ; //设定用于WMI连接操作的用户名 Conn.Username = "WMI用户名"; //设定用户的口令 Conn.Password = "此用户名对应口令"; System.Management.ManagementScope Ms = new ManagementScope("\\majinhu\root\cimv2", Conn ) ;


  ( 2 ) . 利用ManagementScope中提供的Connect方法:

  ManagementScope中的成员是非常少的,最常用的方法和属性各一个:常用属性是Options,主要为WMI建立提供参数;常用方法是Connect,通过它可以建立于远程计算机的WMI连接。下列是利用Connect方法建立WMI连接的具体代码:

System.Management.ConnectionOptions Conn = new ConnectionOptions ( ) ; //设定用于WMI连接操作的用户名 Conn.Username = "WMI用户名"; //设定用户的口令 Conn.Password = "此用户名对应口令"; System.Management.ManagementScope Ms = new ManagementScope("\\majinhu\root\cimv2" ) ; Ms.Options = Conn ; Ms.Connect ( ) ; //建立WMI连接


  ·ObjectQuery类

  ObjectQuery类或其派生类用于在ManagementObjectSearcher中指定查询。程序中一般采用查询字符串来构造ObjectQuery实例。其中的查询字符串是一种类似SQL语言的WQL语言。下面的ObjectQuery类构造函数中最常见的一种,具体语法如下:

public ObjectQuery ( string query ) ;


  参数:

  query 查询的字符串

  ·ManagementObjectSearcher类

  ManagementObjectSearcher主要是根据指定的查询检索WMI对象的集合。ManagementObjectSearcher组成成员也非常简单,其方法Get方法是非常重要的,ManagementObjectSearcher通过Get方法进行WMI查询,并把得到的结果集合。Get方法的返回值是一个ManagementObjectCollection实例,它包含匹配指定查询的对象。

  表02是其ManagementObjectSearcher类的常用属性及其说明。

属性 说明
Options 有关如何搜索对象的选项
Query 在搜索器中调用的查询
Scope 在其中查找对象的范围

      表02:ManagementObjectSearcher类常用属性及其说明

  ·ManagementObjectCollection类

  ManagementObjectCollection类非常简单,它主要表示 WMI 实例的不同集合其中包括命名空间、范围和查询观察程序等。创建ManagementObjectCollection类没有构造函数。

  ·ManagementObject类

  ManagementObject类为单个管理对象或类。通过ManagementObject中的方法可以调用ManagementObject对应的对象,从而执行相应的操作。ManagementObject类是一个内容丰富的类,表03和表04分别是其常用的属性和方法。

属性 说明
ClassPath 对象的类的路径。
Options 检索对象时要使用的其他信息。
Path 对象的 WMI 路径。
Scope 此对象在其中驻留的范围。

       表03:ManagementObject类常用属性及其说明

方法 说明
Clone 创建对象的一个副本。
CopyTo 将对象复制到另一个位置。
Delete 删除对象。
Get 绑定到管理对象。
GetRelated 获取与该对象(联系对象)相关的对象的集合。
GetRelationships 获取该对象的关联的集合。
InvokeMethod 调用对应的对象方法。
Put 提交对对象所做的更改。

      表04:ManagementObject类常用方法及其说明

  下面就结合二个具体的示例来介绍Visual C#中利用上述类,提供WMI掌握如何利用WMI编写网络应用程序,所使用的类库主要是使用了上面接收的这六个类。

例子:

复制代码
 1            ConnectionOptions conOptions=new ConnectionOptions();   2             conOptions.Username = "Administrator";   3             conOptions.Password="Abc123";   4             conOptions.Impersonation = ImpersonationLevel.Impersonate;   5             conOptions.EnablePrivileges = true;   6             ManagementScope ms = new ManagementScope("\\\\192.168.11.21\\root\\cimv2", conOptions);   7             try   8             {   9                 ms.Connect();  10                 FileStream fWrite = File.Create("\\\\192.168.11.21\\test\\te.txt");  11             }  12             catch (Exception)  13             {  14                 throw;  15             }
复制代码


[]Wordpress安装百度统计方法

本文自动转发自我的博客: http://www.haofengjing.org/?p=1594
  首先在百度统计获取安装代码,在后台文件中查找 wp-content/themes/footer.php 文件,然后打开,将百度统计代码复制粘贴到页尾<body>的前面,保存并更新文件。