WMI使用技巧集 C#
WMI使用技巧集
很多的朋友對WMI可能見過但理解不深,我也是十分想了解關于WMI的知識,可一直找不對太合適的資料,在網上的一些資料不是有很多錯誤,就是講解不清,我有空的時候將關于WMI的知識集中一下,放在這里便于大家學習。本貼會不斷增加。
1、?什么是WMI
WMI是英文Windows?Management?Instrumentation的簡寫,它的功能主要是:訪問本地主機的一些信息和服務,可以管理遠程計算機(當然你必須要擁有足夠的權限),比如:重啟,關機,關閉進程,創建進程等。
2、?如何用WMI獲得本地磁盤的信息?
首先要在VS.NET中創建一個項目,然后在添加引用中引用一個.net的裝配件:System.Management.dll,這樣你的項目才能使用WMI。代碼如下:
using?System;
using?System.Management;
class?Sample_ManagementObject
{
?public?static?int?Main(string[]?args)?
?{
??SelectQuery?query=new?SelectQuery("Select?*?From?Win32_LogicalDisk");
??ManagementObjectSearcher?searcher=new?ManagementObjectSearcher(query);
??foreach(ManagementBaseObject?disk?in?searcher.Get())
??{
???Console.WriteLine("\r\n"+disk["Name"]?+"?"+disk["DriveType"]?+?"?"?+?disk["VolumeName"]);
??}
??Console.ReadLine();
??return?0;
?}
}
disk["DriveType"]?的返回值意義如下:
1?No?type?
2?Floppy?disk?
3?Hard?disk?
4?Removable?drive?or?network?drive?
5?CD-ROM?
6?RAM?disk
3、如何用WMI獲得指定磁盤的容量?
using?System;
using?System.Management;
//?This?example?demonstrates?reading?a?property?of?a?ManagementObject.
class?Sample_ManagementObject
{
?public?static?int?Main(string[]?args)?
?{
??ManagementObject?disk?=?new?ManagementObject(
???"win32_logicaldisk.deviceid=\"c:\"");
??disk.Get();
??Console.WriteLine("Logical?Disk?Size?=?"?+?disk["Size"]?+?"?bytes");
??Console.ReadLine();?
??return?0;
?}
}
4、?如何列出機器中所有的共享資源?
using?System;
using?System.Management;
class?TestApp?{
?[STAThread]
?static?void?Main()
?{
??ManagementObjectSearcher?searcher?=?new?ManagementObjectSearcher(
???"SELECT?*?FROM?Win32_share");
??foreach?(ManagementObject?share?in?searcher.Get())
??{
???Console.WriteLine(share.GetText(TextFormat.Mof));
??}
?}
}
別忘記在引用中把System.Management添加進來。
5、?怎樣寫程控制讓系統中的某個文件夾共享或取消共享.?
首先,這需要以有相應權限的用戶登錄系統才行。然后,試試下面的代碼:
using?System;
using?System.Management;
class?CreateShare
{
?public?static?void?Main(string[]?args)
?{
??ManagementClass?_class?=?new?ManagementClass(new?ManagementPath("Win32_Share"));
??object[]?obj?=?{"C:\\Temp","我的共享",0,10,"Dot?Net?實現的共享",""};
??_class.InvokeMethod("create",obj);
?}
}
將
object[]?obj?=?{"C:\\Temp","我的共享",0,10,"Dot?Net?實現的共享",""};
改為
object[]?obj?=?{"C:\\Temp","我的共享",0,null,"Dot?Net?實現的共享",""};
就可以實現授權給最多用戶了。
6、?如何獲得系統服務的運行狀態?
private?void?getServices()
{
?ManagementObjectCollection?queryCollection;
?string[]?lvData?=??new?string[4];
??
?try
?{
??queryCollection?=?getServiceCollection("SELECT?*?FROM?Win32_Service");
??foreach?(?ManagementObject?mo?in?queryCollection)
??{
???//create?child?node?for?operating?system
???lvData[0]?=?mo["Name"].ToString();
???lvData[1]?=?mo["StartMode"].ToString();
???if?(mo["Started"].Equals(true))
????lvData[2]?=?"Started";
???else
????lvData[2]?=?"Stop";
????lvData[3]?=?mo["StartName"].ToString();
?????
????//create?list?item
????ListViewItem?lvItem?=?new?ListViewItem(lvData,0);
????listViewServices.Items.Add(lvItem);
??}
?}
?catch?(Exception?e)
?{
??MessageBox.Show("Error:?"?+?e);
?}
}
7、?通過WMI修改IP,而實現不用重新啟動?
using?System;
using?System.Management;
using?System.Threading;
namespace?WmiIpChanger
{
?class?IpChanger
?{
??[MTAThread]
??static?void?Main(string[]?args)
??{
???ReportIP();
???//?SwitchToDHCP();
???SwitchToStatic();
???Thread.Sleep(?5000?);
???ReportIP();
???Console.WriteLine(?"end."?);
??}
??static?void?SwitchToDHCP()
??{
???ManagementBaseObject?inPar?=?null;
???ManagementBaseObject?outPar?=?null;
???ManagementClass?mc?=?new?ManagementClass("Win32_NetworkAdapterConfiguration");
???ManagementObjectCollection?moc?=?mc.GetInstances();
???foreach(?ManagementObject?mo?in?moc?)
???{
????if(?!?(bool)?mo["IPEnabled"]?)
?????continue;
????inPar?=?mo.GetMethodParameters("EnableDHCP");
????outPar?=?mo.InvokeMethod(?"EnableDHCP",?inPar,?null?);
????break;
???}
??}
??static?void?SwitchToStatic()
??{
???ManagementBaseObject?inPar?=?null;
???ManagementBaseObject?outPar?=?null;
???ManagementClass?mc?=?new?ManagementClass("Win32_NetworkAdapterConfiguration");
???ManagementObjectCollection?moc?=?mc.GetInstances();
???foreach(?ManagementObject?mo?in?moc?)
???{
????if(?!?(bool)?mo[?"IPEnabled"?]?)
?????continue;
????inPar?=?mo.GetMethodParameters(?"EnableStatic"?);
????inPar["IPAddress"]?=?new?string[]?{?"192.168.1.1"?};
????inPar["SubnetMask"]?=?new?string[]?{?"255.255.255.0"?};
????outPar?=?mo.InvokeMethod(?"EnableStatic",?inPar,?null?);
????break;
???}
??}
??static?void?ReportIP()
??{
???Console.WriteLine(?"******?Current?IP?addresses:"?);
???ManagementClass?mc?=?new?ManagementClass("Win32_NetworkAdapterConfiguration");
???ManagementObjectCollection?moc?=?mc.GetInstances();
???foreach(?ManagementObject?mo?in?moc?)
???{
????if(?!?(bool)?mo[?"IPEnabled"?]?)
?????continue;
????Console.WriteLine(?"{0}\n?SVC:?'{1}'?MAC:?[{2}]",?(string)?mo["Caption"],
?????(string)?mo["ServiceName"],?(string)?mo["MACAddress"]?);
????string[]?addresses?=?(string[])?mo[?"IPAddress"?];
????string[]?subnets?=?(string[])?mo[?"IPSubnet"?];
????Console.WriteLine(?"?Addresses?:"?);
????foreach(string?sad?in?addresses)
?????Console.WriteLine(?"\t'{0}'",?sad?);
????Console.WriteLine(?"?Subnets?:"?);
????foreach(string?sub?in?subnets?)
?????Console.WriteLine(?"\t'{0}'",?sub?);
???}
??}
?}
}
8、?如何利用WMI遠程重啟遠程計算機?
using?System;
using?System.Management;??
namespace?WMI3
{
??????///?<summary>
??????///?Summary?description?for?Class1.
??????///?</summary>?
??????class?Class1
??????{
????????????static?void?Main(string[]?args)
????????????{
??????????????????Console.WriteLine("Computer?details?retrieved?using?Windows?Management?Instrumentation?(WMI)");
??????????????????Console.WriteLine("mailto:Written%2002/01/02%20By%20John%20O'Donnell%20-%20csharpconsulting@hotmail.com");
??????????????????Console.WriteLine("========================================
=================================");?
???????????????????//連接遠程計算機
????????????ConnectionOptions?co?=?new?ConnectionOptions();
????????????co.Username?=?"john";
????????????co.Password?=?"john";
????????????System.Management.ManagementScope?ms?=?new?System.Management.ManagementScope("\\\\192.168.1.2\\root\\cimv2",?co);??????
??????????????????//查詢遠程計算機
???????????System.Management.ObjectQuery?oq?=?new?System.Management.ObjectQuery("SELECT?*?FROM?Win32_OperatingSystem");
??????????????????
???????????ManagementObjectSearcher?query1?=?new?ManagementObjectSearcher(ms,oq);
???????????ManagementObjectCollection?queryCollection1?=?query1.Get();????????????
??????????????????foreach(?ManagementObject?mo?in?queryCollection1?)?
??????????????????{
????????????????????????string[]?ss={""};
????????????????????????mo.InvokeMethod("Reboot",ss);
????????????????????????Console.WriteLine(mo.ToString());
??????????????????}
????????????}
??????}
}??
9、?利用WMI創建一個新的進程?
using?System;
using?System.Management;
//?This?sample?demonstrates?invoking?a?WMI?method?using?parameter?objects
public?class?InvokeMethod?
{????
?public?static?void?Main()?
?{
??//Get?the?object?on?which?the?method?will?be?invoked
??ManagementClass?processClass?=?new?ManagementClass("Win32_Process");
??//Get?an?input?parameters?object?for?this?method
??ManagementBaseObject?inParams?=?processClass.GetMethodParameters("Create");
??//Fill?in?input?parameter?values
??inParams["CommandLine"]?=?"calc.exe";
??//Execute?the?method
??ManagementBaseObject?outParams?=?processClass.InvokeMethod?("Create",?inParams,?null);
??//Display?results
??//Note:?The?return?code?of?the?method?is?provided?in?the?"returnvalue"?property?of?the?outParams?object
??Console.WriteLine("Creation?of?calculator?process?returned:?"?+?outParams["returnvalue"]);
??Console.WriteLine("Process?ID:?"?+?outParams["processId"]);
?}
}
10、?如何通過WMI終止一個進程?
using?System;?
using?System.Management;?
//?This?example?demonstrates?how?to?stop?a?system?service.?
class?Sample_InvokeMethodOptions?
{?
????public?static?int?Main(string[]?args)?{
????????ManagementObject?service?=?
????????????new?ManagementObject("win32_service=\"winmgmt\"");
????????InvokeMethodOptions?options?=?new?InvokeMethodOptions();
????????options.Timeout?=?new?TimeSpan(0,0,0,5);?
????????ManagementBaseObject?outParams?=?service.InvokeMethod("StopService",?null,?options);
????????Console.WriteLine("Return?Status?=?"?+?outParams["Returnvalue"]);
????????return?0;
????}
}
11、?如何用WMI?來獲取遠程機器的目錄以及文件.比如如何列出一個目錄下的所有文件,或者所有子目錄;如何刪除,舔加,更改文件?
using?System;
????????????using?System.Management;
????????????//?This?example?demonstrates?reading?a?property?of?a?ManagementObject.
????????????class?Sample_ManagementObject
????????????{
????????????????public?static?int?Main(string[]?args)?{
????????????????????ManagementObject?disk?=?new?ManagementObject(
????????????????????????"win32_logicaldisk.deviceid=\"c:\"");
????????????????????disk.Get();
????????????????????Console.WriteLine("Logical?Disk?Size?=?"?+?disk["Size"]?+?"?bytes");
????????????????????return?0;
????????????????}
????????????}
12、?參考資料
可以參考下列內容:
msdn?WMI?SDK:
http://msdn.microsoft.com/library/default.asp?url=/library/en-??us/wmisdk/wmi/wmi_start_page.asp
WMI使用說明(csdn):
http://www.csdn.net/develop/article/15/15346.shtm
WMI技術的應用?for?.net(csdn):
http://www.csdn.net/develop/article/16/16419.shtm
在.NET中輕松獲取系統信息(1)?-WMI篇(csdn):
http://www.csdn.net/develop/article/15/15744.shtm
?:)
13、?一些技巧
我使用WMI可以取出網卡的MAC地址,CPU的系列號,主板的系列號,其中主板的系列號已經核對過沒有錯的,其余的有待于驗證,因為我使用的是筆記本,筆記本背面有一個主板的系列號,所以可以肯定主板系列號沒有問題
網卡的MAC地址
SELECT?MACAddress?FROM?Win32_NetworkAdapter?WHERE?((MACAddress?Is?Not?NULL)?AND?(Manufacturer?<>?'Microsoft'))
結果:08:00:46:63:FF:8C
CPU的系列號
Select?ProcessorId?From?Win32_Processor
結果:3FEBF9FF00000F24
主板的系列號
Select?SerialNumber?From?Win32_BIOS
結果:28362630-3700521
獲取硬盤ID
String?HDid;
ManagementClass?cimobject?=?new?ManagementClass("Win32_DiskDrive");
ManagementObjectCollection?moc?=?cimobject.GetInstances();
foreach(ManagementObject?mo?in?moc)
{
?HDid?=?(string)mo.Properties["Model"].value;
?MessageBox.Show(HDid??);?
}
14、?一個使用WMI后的異常處理的問題
下面是我整理的一段代碼.
?
?ManagementObjectCollection?queryCollection1;
??ConnectionOptions?co?=?new?ConnectionOptions();
??co.Username?=?"administrator";
??co.Password?=?"111";
??try
??{
???System.Management.ManagementScope?ms?=?new?System.Management.ManagementScope(@"\\csnt3\root\cimv2",?co);
???System.Management.ObjectQuery?oq?=?new?System.Management.ObjectQuery("SELECT?*?FROM?Win32_OperatingSystem");
???ManagementObjectSearcher?query1?=?new?ManagementObjectSearcher(ms,oq);
???queryCollection1?=?query1.Get();
???foreach(?ManagementObject?mo?in?queryCollection1?)
???{
????string[]?ss={""};
????mo.InvokeMethod("Reboot",ss);
????Console.WriteLine(mo.ToString());
???}
??}
??catch(Exception?ee)
??{
???Console.WriteLine("error");
??}
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序列號代碼
string?cpuInfo?=?"";//cpu序列號
???ManagementClass?cimobject?=?new?ManagementClass("Win32_Processor");
???ManagementObjectCollection?moc?=?cimobject.GetInstances();
???foreach(ManagementObject?mo?in?moc)
???{
????cpuInfo?=?mo.Properties["ProcessorId"].value.ToString();
????Console.WriteLine(cpuInfo);
????Console.ReadLine();
???}
獲取網卡硬件地址
using?System.Management;
...
ManagementClass?mc?=?new?ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection?moc?=?mc.GetInstances();
foreach(ManagementObject?mo?in?moc)
{
if((bool)mo["IPEnabled"]?==?true)
Console.WriteLine("MAC?address\t{0}",?mo["MacAddress"].ToString());
mo.Dispose();
}
}
獲取硬盤ID
String?HDid;
ManagementClass?cimobject?=?new?ManagementClass("Win32_DiskDrive");
ManagementObjectCollection?moc?=?cimobject.GetInstances();
foreach(ManagementObject?mo?in?moc)
{
?HDid?=?(string)mo.Properties["Model"].value;
?MessageBox.Show(HDid??);?
}
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的操作,可以查詢系統軟硬件的信息,先看一個簡單的例子:
Imports?System.Management
Dim?searcher?As?New?ManagementObjectSearcher("SELECT?*?FROM?Win32_share")
Dim?share?As?ManagementObject
?For?Each?share?In?searcher.Get()
???????MessageBox.Show(share.GetText(TextFormat.Mof))
?Next?share
運行的結果是列出了所有系統當前共享的目錄、以及描述等等。
分析一下上面的代碼,可以看到一下幾點:
1、似乎是在進行數據庫操作,有點像SQL語句。其實就是SQL操作,這種語句被成WQL(WMI?Query?Language),實際上是標準SQL的一個子集加上了WMI的擴展.
2、WQL是個只讀的查詢語言,我們只能查詢響應的數據,不能用UPDATE,INSERT等更新操作
3、代碼很簡單、通俗易懂
4、我們采用了一種MOF(托管對象格式)的顯示。
例子二:獲取當前主板的信息
?上面的例子是一個軟件方面的信息,下面看一個獲取硬件信息的例子,獲取主板的序列號以及制造商:
Dim?searcher?As?New?ManagementObjectSearcher("SELECT?*?FROM?Win32_BaseBoard")
Dim?share?As?ManagementObject
???For?Each?share?In?searcher.Get()
??????Debug.WriteLine("主板制造商:"?&?share("Manufacturer"))
??????Debug.WriteLine("型號:"?&?share("Product"))
??????Debug.WriteLine("序列號:"?&?share("SerialNumber"))
???Next?share
總結以及補充:
?WMI類也是分層次的,具體可以參考msdn中的WMI;轉向.NET平臺開發的時候,最好能多看一些關于.NET新特性的介紹,這樣可以大幅度的提升代碼的開發效率以及運行效率。
轉載于:https://www.cnblogs.com/halgogo/articles/189426.html
總結
以上是生活随笔為你收集整理的WMI使用技巧集 C#的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux下安装jdk8步骤详述
- 下一篇: Spring Data JPA - 参考