• c#与WMI使用技巧集


    1、 什么是WMI
    WMI是英文Windows Management Instrumentation的简写,它的功能主要是:访问本地主机的一些信息和服务,可以管理远程计算机(当然你必须要拥有足够的权限),比如:重 启,关机,关闭进程,创建进程等。
    2、 如何用WMI获得本地磁盘的信息?
    首先要在VS.NET中创建一个项目,然后在添加引用中引 用一个.net的装配件:System.Management.dll,这样你的项目才能使用WMI。代码如下:

     1using System; 
     2using System.Management; 
     3
     4class Sample_ManagementObject 
     5
     6public static int Main(string[] args) 
     7
     8SelectQuery query=new SelectQuery("Select * From Win32_LogicalDisk"); 
     9ManagementObjectSearcher searcher=new ManagementObjectSearcher(query); 
    10foreach(ManagementBaseObject disk in searcher.Get()) 
    11
    12Console.WriteLine("\r\n"+disk["Name"+" "+disk["DriveType"+ " " + disk["VolumeName"]); 
    13}
     
    14
    15Console.ReadLine(); 
    16return 0
    17}
     
    18}
     
    19
    20//disk["DriveType"] 的返回值意义如下: 
    21
    221 No type 
    232 Floppy disk 
    243 Hard disk 
    254 Removable drive or network drive 
    265 CD-ROM 
    276 RAM disk 
    28


    3、如何用WMI获得指定磁盘的容量?

     1using System; 
     2using System.Management; 
     3// This example demonstrates reading a property of a ManagementObject. 
     4class Sample_ManagementObject 
     5
     6public static int Main(string[] args) 
     7
     8ManagementObject disk = new ManagementObject( 
     9"win32_logicaldisk.deviceid=\"c:\""); 
    10disk.Get(); 
    11Console.WriteLine("Logical Disk Size = " + disk["Size"+ " bytes"); 
    12Console.ReadLine(); 
    13return 0
    14}
     
    15}
     


    4、 如何列出机器中所有的共享资源?

     1using System; 
     2using System.Management; 
     3class TestApp 
     4[STAThread] 
     5static void Main() 
     6
     7ManagementObjectSearcher searcher = new ManagementObjectSearcher( 
     8"SELECT * FROM Win32_share"); 
     9foreach (ManagementObject share in searcher.Get()) 
    10
    11Console.WriteLine(share.GetText(TextFormat.Mof)); 
    12}
     
    13}
     
    14
    15}
     
    16
    17


    别忘记在引用中把System.Management添加进来。

    5、 怎样写程控制让系统中的某个文件夹共享或取消共享.?
    首先,这需要以有相应权限的用户登录系统才行。然后,试试下面的代码:

     1using System; 
     2using System.Management; 
     3class CreateShare 
     4
     5public static void Main(string[] args) 
     6
     7ManagementClass _class = new ManagementClass(new ManagementPath("Win32_Share")); 
     8object[] obj = {"C:\\Temp","我的共享",0,10,"Dot Net 实现的共享",""}
     9_class.InvokeMethod("create",obj); 
    10}
     
    11}
     


    1object[] obj = {"C:\\Temp","我的共享",0,10,"Dot Net 实现的共享",""}


    改为

    1object[] obj = {"C:\\Temp","我的共享",0,null,"Dot Net 实现的共享",""}


    就可以实现授权给最多用户了。

    6、 如何获得系统服务的运行状态?

     1private void getServices() 
     2
     3ManagementObjectCollection queryCollection; 
     4string[] lvData = new string[4]; 
     5try 
     6
     7queryCollection = getServiceCollection("SELECT * FROM Win32_Service"); 
     8foreach ( ManagementObject mo in queryCollection) 
     9
    10//create child node for operating system 
    11lvData[0= mo["Name"].ToString(); 
    12lvData[1= mo["StartMode"].ToString(); 
    13if (mo["Started"].Equals(true)) 
    14lvData[2= "Started"
    15else 
    16lvData[2= "Stop"
    17lvData[3= mo["StartName"].ToString(); 
    18//create list item 
    19ListViewItem lvItem = new ListViewItem(lvData,0); 
    20listViewServices.Items.Add(lvItem); 
    21}
     
    22}
     
    23catch (Exception e) 
    24
    25MessageBox.Show("Error: " + e); 
    26}
     
    27}
     


    7、 通过WMI修改IP,而实现不用重新启动?

     1using System; 
     2using System.Management; 
     3using System.Threading; 
     4namespace WmiIpChanger 
     5
     6class IpChanger 
     7
     8[MTAThread] 
     9static void Main(string[] args) 
    10
    11ReportIP(); 
    12// SwitchToDHCP(); 
    13SwitchToStatic(); 
    14Thread.Sleep( 5000 ); 
    15ReportIP(); 
    16Console.WriteLine( "end." ); 
    17}
     
    18static void SwitchToDHCP() 
    19
    20ManagementBaseObject inPar = null
    21ManagementBaseObject outPar = null
    22ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); 
    23ManagementObjectCollection moc = mc.GetInstances(); 
    24foreach( ManagementObject mo in moc ) 
    25
    26if! (bool) mo["IPEnabled"] ) 
    27continue
    28inPar = mo.GetMethodParameters("EnableDHCP"); 
    29outPar = mo.InvokeMethod( "EnableDHCP", inPar, null ); 
    30break
    31}
     
    32}
     
    33static void SwitchToStatic() 
    34
    35ManagementBaseObject inPar = null
    36ManagementBaseObject outPar = null
    37ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); 
    38ManagementObjectCollection moc = mc.GetInstances(); 
    39foreach( ManagementObject mo in moc ) 
    40
    41if! (bool) mo[ "IPEnabled" ] ) 
    42continue
    43inPar = mo.GetMethodParameters( "EnableStatic" ); 
    44inPar["IPAddress"= new string[] "192.168.1.1" }
    45inPar["SubnetMask"= new string[] "255.255.255.0" }
    46outPar = mo.InvokeMethod( "EnableStatic", inPar, null ); 
    47break
    48}
     
    49}
     
    50static void ReportIP() 
    51
    52Console.WriteLine( "****** Current IP addresses:" ); 
    53ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); 
    54ManagementObjectCollection moc = mc.GetInstances(); 
    55foreach( ManagementObject mo in moc ) 
    56
    57if! (bool) mo[ "IPEnabled" ] ) 
    58continue
    59Console.WriteLine( "{0}\n SVC: '{1}' MAC: [{2}]", (string) mo["Caption"], 
    60(string) mo["ServiceName"], (string) mo["MACAddress"] ); 
    61string[] addresses = (string[]) mo[ "IPAddress" ]; 
    62string[] subnets = (string[]) mo[ "IPSubnet" ]; 
    63Console.WriteLine( " Addresses :" ); 
    64foreach(string sad in addresses) 
    65Console.WriteLine( "\t'{0}'", sad ); 
    66Console.WriteLine( " Subnets :" ); 
    67foreach(string sub in subnets ) 
    68Console.WriteLine( "\t'{0}'", sub ); 
    69}
     
    70}
     
    71}
     
    72}
     


    8、 如何利用WMI远程重启远程计算机?

     1using System; 
     2using System.Management; 
     3namespace WMI3 
     4
     5/// <summary> 
     6/// Summary description for Class1. 
     7/// </summary> 

     8class Class1 
     9
    10static void Main(string[] args) 
    11
    12Console.WriteLine("Computer details retrieved using Windows Management Instrumentation (WMI)"); 
    13Console.WriteLine("mailto:Written%2002/01/02%20By%20John%20O'Donnell%20-%20csharpconsulting@hotmail.com"); 
    14Console.WriteLine("======================================== 
    15================================="); 
    16//连接远程计算机 
    17ConnectionOptions co = new ConnectionOptions(); 
    18co.Username = "john"
    19co.Password = "john"
    20System.Management.ManagementScope ms = new System.Management.ManagementScope("\\\\192.168.1.2\\root\\cimv2", co); 
    21//查询远程计算机 
    22System.Management.ObjectQuery oq = new System.Management.ObjectQuery("SELECT * FROM Win32_OperatingSystem"); 
    23ManagementObjectSearcher query1 = new ManagementObjectSearcher(ms,oq); 
    24ManagementObjectCollection queryCollection1 = query1.Get(); 
    25foreach( ManagementObject mo in queryCollection1 ) 
    26
    27string[] ss={""}
    28mo.InvokeMethod("Reboot",ss); 
    29Console.WriteLine(mo.ToString()); 
    30}
     
    31}
     
    32}
     
    33}
     
    34
    35


    9、 利用WMI创建一个新的进程?

     1using System; 
     2using System.Management; 
     3// This sample demonstrates invoking a WMI method using parameter objects 
     4public class InvokeMethod 
     5
     6public static void Main() 
     7
     8//Get the object on which the method will be invoked 
     9ManagementClass processClass = new ManagementClass("Win32_Process"); 
    10//Get an input parameters object for this method 
    11ManagementBaseObject inParams = processClass.GetMethodParameters("Create"); 
    12//Fill in input parameter values 
    13inParams["CommandLine"= "calc.exe"
    14//Execute the method 
    15ManagementBaseObject outParams = processClass.InvokeMethod ("Create", inParams, null); 
    16//Display results 
    17//Note: The return code of the method is provided in the "returnvalue" property of the outParams object 
    18Console.WriteLine("Creation of calculator process returned: " + outParams["returnvalue"]); 
    19Console.WriteLine("Process ID: " + outParams["processId"]); 
    20}
     
    21}
     


    10、 如何通过WMI终止一个进程?

     1using System; 
     2using System.Management; 
     3// This example demonstrates how to stop a system service. 
     4class Sample_InvokeMethodOptions 
     5
     6public static int Main(string[] args) 
     7ManagementObject service = 
     8new ManagementObject("win32_service=\"winmgmt\""); 
     9InvokeMethodOptions options = new InvokeMethodOptions(); 
    10options.Timeout = new TimeSpan(0,0,0,5); 
    11ManagementBaseObject outParams = service.InvokeMethod("StopService"null, options); 
    12Console.WriteLine("Return Status = " + outParams["Returnvalue"]); 
    13return 0
    14}
     
    15}
     


    11、 如何用WMI 来获取远程机器的目录以及文件.比如如何列出一个目录下的所有文件,或者所有子目录;如何删除,舔加,更改文件?

     1using System; 
     2using System.Management; 
     3// This example demonstrates reading a property of a ManagementObject. 
     4class Sample_ManagementObject 
     5
     6public static int Main(string[] args) 
     7ManagementObject disk = new ManagementObject( 
     8"win32_logicaldisk.deviceid=\"c:\""); 
     9disk.Get(); 
    10Console.WriteLine("Logical Disk Size = " + disk["Size"+ " bytes"); 
    11return 0
    12}
     
    13}
     
    14


    13、 一些技巧
    我使用WMI可以取出网卡的MAC地址,CPU的系列号,主板的系列号,其中主板的系列号已经核对过没有错的, 其余的有待于验证,因为我使用的是笔记本,笔记本背面有一个主板的系列号,所以可以肯定主板系列号没有问题
    网卡的MAC地址

    1SELECT MACAddress FROM Win32_NetworkAdapter WHERE ((MACAddress Is Not NULL) AND (Manufacturer <> 'Microsoft')) 
    2
    3结果:08:00:46:63:FF:8C 


    CPU的系列号

    1Select ProcessorId From Win32_Processor 
    2
    3结果:3FEBF9FF00000F24 


    主板的系列号

    1Select SerialNumber From Win32_BIOS 
    2
    3结果:28362630-3700521 


    获取硬盘ID

    1String HDid; 
    2ManagementClass cimobject = new ManagementClass("Win32_DiskDrive"); 
    3ManagementObjectCollection moc = cimobject.GetInstances(); 
    4foreach(ManagementObject mo in moc) 
    5
    6HDid = (string)mo.Properties["Model"].value; 
    7MessageBox.Show(HDid ); 
    8}
     


    14、 一个使用WMI后的异常处理的问题
    下面是我整理的一段代码.

     1ManagementObjectCollection queryCollection1; 
     2ConnectionOptions co = new ConnectionOptions(); 
     3co.Username = "administrator"
     4co.Password = "111"
     5try 
     6
     7System.Management.ManagementScope ms = new System.Management.ManagementScope(@"http://www.cnblogs.com/Sandheart/admin/file://csnt3/root/cimv2", co); 
     8System.Management.ObjectQuery oq = new System.Management.ObjectQuery("SELECT * FROM Win32_OperatingSystem"); 
     9ManagementObjectSearcher query1 = new ManagementObjectSearcher(ms,oq); 
    10queryCollection1 = query1.Get(); 
    11foreach( ManagementObject mo in queryCollection1 ) 
    12
    13string[] ss={""}
    14mo.InvokeMethod("Reboot",ss); 
    15Console.WriteLine(mo.ToString()); 
    16}
     
    17}
     
    18catch(Exception ee) 
    19
    20Console.WriteLine("error"); 
    21}
     


    15、Windows 管理规范 (WMI) 是可伸缩的系统管理结构,它采用一个统一的、基于标准的、可扩展的面向对象接口。WMI 为您提供与系统管理信息和基础 WMI API 交互的标准方法。WMI 主要由系统管理应用程序开发人员和管理员用来访问和操作系统管理信息。
    WMI 可用于生成组织和管理系统信息的工具,使管理员或系统管理人员能够更密切地监视系统活动。例如,可以使用 WMI 开发一个应用程序,用于在 Web 服务器崩溃时呼叫管理员。
    将 WMI 与 .NET 框架一起使用
    WMI 提供了大量的规范以便为许多高端应用程序(例如,Microsoft Exchange、Microsoft SQL Server 和 Microsoft Internet 信息服务 (IIS))实现几乎任何管理任务。管理员可以执行下列任务:
    ? 监视应用程序的运行状况。
    ? 检测瓶颈或故障。
    ? 管理和配置应用程序。
    ? 查询应用程序数据(使用对象关系的遍历和查询)。
    ? 执行无缝的本地或远程管理操作。
    WMI 结构由以下三层组成:
    ? 客户端
    使用 WMI 执行操作(例如,读取管理详细信息、配置系统和预订事件)的软件组件。
    ? 对象管理器
    提供程序与客户端之间的中间装置,它提供一些关 键服务,如标准事件发布和预订、事件筛选、查询引擎等。
    ? 提供程序
    软件组件,它们捕获实时数据并将其返回到客户端应用程序,处理来 自客户端的方法调用并将客户端链接到所管理的基础结构。
    通过定义完善的架构向客户端和应用程序无缝地提供了数据和事件以及配置系统的能力。在 .NET 框架中,System.Management 命名空间提供了用于遍历 WMI 架构的公共类。
    除了 .NET 框架,还需要在计算机上安装 WMI 才能使用该命名空间中的管理功能。如果使用的是 Windows Millennium Edition、Windows 2000 或 Windows XP,那么已经安装了 WMI。否则,将需要从 MSDN 下载 WMI。
    用 System.Management 访问管理信息
    System.Management 命名空间是 .NET 框架中的 WMI 命名空间。此命名空间包括下列支持 WMI 操作的第一级类对象:
    ? ManagementObject 或 ManagementClass:分别为单个管理对象或类。
    ? ManagementObjectSearcher:用于根据指定的查询或枚举检索 ManagementObject 或 ManagementClass 对象的集合。
    ? ManagementEventWatcher:用于预订来自 WMI 的事件通知。
    ? ManagementQuery:用作所有查询类的基础。
    System.Management 类的使用编码范例对 .NET 框架环境很适合,并且 WMI 在任何适当的时候均使用标准基框架。例如,WMI 广泛利用 .NET 集合类并使用推荐的编码模式,如 .NET 异步操作的“委托”模式。因此,使用 .NET 框架的开发人员可以使用他们的当前技能访问有关计算机或应用程序的管理信息。
    请参见
    使 用 WMI 管理应用程序 | 检索管理对象的集合 | 查询管理信息 | 预订和使用管理事件 | 执行管理对象的方法 | 远程处理和连接选项 | 使用强类型对象

    获取CPU序列号代码

     1string cpuInfo = "";//cpu序列号 
     2ManagementClass cimobject = new ManagementClass("Win32_Processor"); 
     3ManagementObjectCollection moc = cimobject.GetInstances(); 
     4foreach(ManagementObject mo in moc) 
     5
     6cpuInfo = mo.Properties["ProcessorId"].value.ToString(); 
     7Console.WriteLine(cpuInfo); 
     8Console.ReadLine(); 
     9}
     
    10


    获取网卡硬件地址

     1using System.Management; 
     2 
     3ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); 
     4ManagementObjectCollection moc = mc.GetInstances(); 
     5foreach(ManagementObject mo in moc) 
     6
     7if((bool)mo["IPEnabled"== true
     8Console.WriteLine("MAC address\t{0}", mo["MacAddress"].ToString()); 
     9mo.Dispose(); 
    10}
     
    11
    12


    获取硬盘ID

    1String HDid; 
    2ManagementClass cimobject = new ManagementClass("Win32_DiskDrive"); 
    3ManagementObjectCollection moc = cimobject.GetInstances(); 
    4foreach(ManagementObject mo in moc) 
    5
    6HDid = (string)mo.Properties["Model"].value; 
    7MessageBox.Show(HDid ); 
    8}
     

    16、在.NET中轻松获取系统信息(1) -WMI篇
    Montaque
    申明:
    1、个人的一点心得,仅供参考
    2、 转载时候,请保留原本。
    概述:
    不知道大家有没有这种体会?有时候为了获取系统一点点信息,比如考虑一下操作系统的版本号,或者当前屏 幕的分辨率。其实说到底就是读操作系统某个方面的一个属性值而已,然后就看到我们的程序中密密麻麻的Win32 API申明,调用,代码的可读性和维护性不言而喻。到了.NET,微软提供了更为丰富的类,有很多以前要调用API的方法可以在.NET中轻而易举的调用 实现。今天简单介绍一个在.NET中如何通过与WMI(Windows 管理规范)的通讯,从而得到获取信息的目的。
    主要思路:
    举一 个获取操作系统共享目录和获取主板号的例子,介绍如何利用System.Managment下面的类获取系统相关的信息:
    正文:
    WMI(Windows 管理规范:Windows Management Instrumentation)是Microsoft基于Web的企业管理(WBEM)的实现,同时也是一种基于标准的系统管理接口。WMI最早出现在 Microsoft Windows 2000系统上,但它同样可以安装在Windows NT 4和Windows 9x计算机上。WMI是一种轻松获取系统信息的强大工具。
    在.NET中,有一个System.Management名空间(系统默认没有引用, 我们可以手动添加引用),通过下面的Class的操作,可以查询系统软硬件的信息,先看一个简单的例子:

    1Imports System.Management 
    2Dim searcher As New ManagementObjectSearcher("SELECT * FROM Win32_share"
    3Dim share As ManagementObject 
    4For Each share In searcher.Get() 
    5MessageBox.Show(share.GetText(TextFormat.Mof)) 
    6Next share 

    运行的结果是列出了所有系统当前共享的目录、以及描述等等。
    分析一下上面的代码,可以看到一下几点:
    1、似乎是在进行数据库操 作,有点像SQL语句。其实就是SQL操作,这种语句被成WQL(WMI Query Language),实际上是标准SQL的一个子集加上了WMI的扩展.
    2、WQL是个只读的查询语言,我们只能查询响应的数据,不能用 UPDATE,INSERT等更新操作
    3、代码很简单、通俗易懂
    4、我们采用了一种MOF(托管对象格式)的显示。
    例子 二:获取当前主板的信息
    上面的例子是一个软件方面的信息,下面看一个获取硬件信息的例子,获取主板的序列号以及制造商:

    1Dim searcher As New ManagementObjectSearcher("SELECT * FROM Win32_BaseBoard"
    2Dim share As ManagementObject 
    3For Each share In searcher.Get() 
    4Debug.WriteLine("主板制造商:" & share("Manufacturer")) 
    5Debug.WriteLine("型号:" & share("Product")) 
    6Debug.WriteLine("序列号:" & share("SerialNumber")) 
    7Next share 
    总结以及补充:
    WMI类也是分层次的,具体可以参考msdn中的WMI;转向.NET平台开发的时候,最好能多看一些关于.NET新特性 的介绍,这样可以大幅度的提升代码的开发效率以及运行效率。
  • 相关阅读:
    Java线程面试题 Top 50
    深入理解java内存模型
    线程池的理解
    Thread的理解
    ThreadLocal的理解
    排序算法(简)
    排序算法
    【Java集合源码剖析】LinkedHashmap源码剖析
    vsftp上传文件权限问题
    xp 通过注册表修改环境变量
  • 原文地址:https://www.cnblogs.com/top5/p/1732135.html
Copyright © 2020-2023  润新知