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; } } }

没有评论:

发表评论