哪吒2之魔童闹海|哪吒2之魔童归来免费观看|哪吒2在线观看|哪吒2魔童闹海电影免费观看|哪吒2免费观看完整版大电影|哪吒1免费观看完整版

新疆軟件開發(fā)

本站首頁(yè) 軟件開發(fā) 成功案例 公司新聞 公司簡(jiǎn)介 客服中心 軟件技術(shù) 網(wǎng)站建設(shè)
  您現(xiàn)在的位置: 新疆二域軟件開發(fā)公司 >> 開發(fā)語(yǔ)言 >> 文章正文

基礎(chǔ)學(xué)習(xí):WMI介紹及簡(jiǎn)單應(yīng)用

前言: 由于.net的某些特點(diǎn)使它脫離了操作系統(tǒng)底層,所以如果我們想獲得一些底層的操作系統(tǒng)信息的時(shí)候比較困難,經(jīng)常需要DllImport技術(shù),這對(duì)一些對(duì)C/C++不熟悉的程序員來說簡(jiǎn)直是一個(gè)夢(mèng)魘(對(duì)于我來說也是如此,雖然大學(xué)里學(xué)習(xí)過C/C++,可是我從來沒有用過它們做過任何實(shí)際的應(yīng)用程序開發(fā)),所以能通過一些簡(jiǎn)單的辦法處理的,我都繞過去了,很多時(shí)候我喜歡借助命令行來執(zhí)行一些命令,然后截取輸出流,處理之后返回我需要的結(jié)果,這個(gè)也是比較痛苦的。經(jīng)常訪問我的博客的朋友應(yīng)該對(duì)我的一篇文章很熟悉,或者從別的地方看到過,因?yàn)樗槐姸嗑W(wǎng)站轉(zhuǎn)載了,這篇文章就是《用C#獲取CPU編號(hào)、硬盤編號(hào)等系統(tǒng)有關(guān)環(huán)境、屬性》,網(wǎng)址是:http://blog.csdn.net/zhoufoxcn/archive/2007/03/20/1534949.aspx。
其實(shí),還有一個(gè)為大家所陌生、但功能卻又十分強(qiáng)大的工具,它就是WMI。WMI(Windows管理規(guī)范:Windows Management Instrumentation)是Microsoft基于Web的企業(yè)管理(WBEM)的實(shí)現(xiàn),同時(shí)也是一種基于標(biāo)準(zhǔn)的系統(tǒng)管理接口。WMI最早出現(xiàn)在Microsoft Windows 2000系統(tǒng)上,但它同樣可以安裝在Windows NT 4和Windows 9x計(jì)算機(jī)上。WMI是一種輕松獲取系統(tǒng)信息的強(qiáng)大工具。利用它但是由于缺少WMI的介紹資料和學(xué)習(xí)資料(特別是中文的,因?yàn)閲?guó)內(nèi)大部分程序員的E文水平都比較湊合,呵呵,本人也是相當(dāng)湊合),所以知道WMI的不多,能運(yùn)用的就少之又少了。
在WMI中有一種查詢語(yǔ)言,類似于SQL語(yǔ)言,這種語(yǔ)言叫做WQL(WMI Query Language),實(shí)際上是標(biāo)準(zhǔn)SQL的一個(gè)子集加上了WMI的擴(kuò)展。在接下來的教程中我會(huì)給大家演示一些WQL的例子。
用js或者vbs都可以通過WMI來獲取系統(tǒng)信息。下面是一個(gè)用vbs編寫的獲取系統(tǒng)序列號(hào)的小程序,你可以把它復(fù)制到一個(gè)文本文件里,然后保存為文件為.vbs的文件,然后運(yùn)行:
Set SNSet = GetObject("winmgmts:").InstancesOf ("Win32_OperatingSystem")
for each SN in SNSet

 MsgBox "當(dāng)前操作系統(tǒng)的序列號(hào)是: " & SN.SerialNumber
next
這是在我的機(jī)子上運(yùn)行的結(jié)果:

如果通過常規(guī)手段在.net里讓你寫這個(gè)方法不知道你需要多少行代碼?需要利用幾次搜索引擎?一會(huì)我將展示如何在.net里利用WMI獲取操作系統(tǒng)序列號(hào)。
其實(shí)在.net里是支持WMI編程的,在.net類庫(kù)里專門有一個(gè)System.Management 命名空間,MSDN介紹這個(gè)命名空間如下:
“提供對(duì)大量管理信息和管理事件集合的訪問,這些信息和事件是與根據(jù) Windows 管理規(guī)范 (WMI) 結(jié)構(gòu)對(duì)系統(tǒng)、設(shè)備和應(yīng)用程序設(shè)置檢測(cè)點(diǎn)有關(guān)的。應(yīng)用程序和服務(wù)可以使用從 ManagementObjectSearcher 和 ManagementQuery 派生的類,查詢感興趣的管理信息(例如在磁盤上還剩多少可用空間、當(dāng)前 CPU 利用率是多少、某一應(yīng)用程序正連接到哪一數(shù)據(jù)庫(kù)等等);或者應(yīng)用程序和服務(wù)可以使用 ManagementEventWatcher 類預(yù)訂各種管理事件。這些可訪問的數(shù)據(jù)可以來自分布式環(huán)境中托管的和非托管的組件!。

System.Management 命名空間包含了下面一些常用類:
◆ManagementObject 或 ManagementClass:分別為單個(gè)管理對(duì)象或類。  
◆ManagementObjectSearcher:用于根據(jù)指定的查詢或枚舉檢索 ManagementObject 或 ManagementClass 對(duì)象的集合。  
◆ManagementEventWatcher:用于預(yù)訂來自 WMI 的事件通知。  
◆ManagementQuery:用作所有查詢類的基礎(chǔ)。

在實(shí)際編程中需要注意,System.Management 命名空間中的類都存在于System.Management .dll這個(gè)文件中,所以在編程的時(shí)候一定要添加對(duì)這個(gè)dll文件的引用,如下圖:

然后還需要在我們的程序開始處添加如下代碼:System.Management,這樣我們采用使用這個(gè)命名空間下的類來進(jìn)行WMI編程。

下面我將用一個(gè)方法展示我剛才提到的如何在.net里獲取操作系統(tǒng)序列號(hào):


        /// <summary>
        /// 獲取操作系統(tǒng)序列號(hào)
        /// </summary>
        /// <returns></returns>
        public string GetSerialNumber()
        {
            string result = "";
            ManagementClass mClass = new ManagementClass("Win32_OperatingSystem");
            ManagementObjectCollection moCollection = mClass.GetInstances();
            foreach (ManagementObject mObject in moCollection)
            {
                result += mObject["SerialNumber"].ToString();
            }
            return result;
        }
我想這個(gè)方法夠簡(jiǎn)單的了。

下面貼出一些常用的方法來獲取系統(tǒng)相關(guān)的信息,代碼如下:


using System;
using System.Collections.Generic;
using System.Text;

namespace WMIDemo
{
    /// <summary>
    /// 說明:這個(gè)類很簡(jiǎn)單,主要包含一個(gè)Main方法
    /// 作者:周公
    /// 日期:2008-1-14
    /// 首發(fā)地址:http://blog.csdn.net/zhoufoxcn
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            GetSystemInfo getInfo = new GetSystemInfo();
            Console.WriteLine("序列號(hào)="+getInfo.GetSerialNumber());
            Console.WriteLine("CPU編號(hào)=" + getInfo.GetCpuID());
            Console.WriteLine("硬盤編號(hào)=" + getInfo.GetMainHardDiskId());
            Console.WriteLine("主板編號(hào)=" + getInfo.GetMainBoardId());
            Console.WriteLine("網(wǎng)卡編號(hào)=" + getInfo.GetNetworkAdapterId());
            Console.WriteLine("用戶組=" + getInfo.GetGroupName());
            Console.WriteLine("驅(qū)動(dòng)器情況=" + getInfo.GetDriverInfo());
            Console.ReadLine();
        }
    }
}由于是一個(gè)命令行程序,所以有上面那個(gè)類,下面這個(gè)類才包含我要展示的代碼:
using System;
using System.Collections.Generic;
using System.Text;
using System.Management;

namespace WMIDemo
{
    /// <summary>
    /// 說明:這個(gè)類主要用來展示如何利用WMI來獲取一些操作系統(tǒng)的信息
    /// 作者:周公
    /// 時(shí)間:2008-1-14
    /// 首發(fā)地址:http://blog.csdn.net/zhoufoxcn
    /// </summary>
    public class GetSystemInfo
    {
        /// <summary>
        /// 獲取操作系統(tǒng)序列號(hào)
        /// </summary>
        /// <returns></returns>
        public string GetSerialNumber()
        {
            string result = "";
            ManagementClass mClass = new ManagementClass("Win32_OperatingSystem");
            ManagementObjectCollection moCollection = mClass.GetInstances();
            foreach (ManagementObject mObject in moCollection)
            {
                result += mObject["SerialNumber"].ToString() + " ";
            }
            return result;
        }
        /// <summary>
        /// 查詢CPU編號(hào)
        /// </summary>
        /// <returns></returns>
        public string GetCpuID()
        {
            string result = "";
            ManagementClass mClass = new ManagementClass("Win32_Processor");
            ManagementObjectCollection moCollection = mClass.GetInstances();
            foreach (ManagementObject mObject in moCollection)
            {
                result += mObject["ProcessorId"].ToString() + " ";
            }
            return result;
        }
        /// <summary>
        /// 查詢硬盤編號(hào)
        /// </summary>
        /// <returns></returns>
        public string GetMainHardDiskId()
        {
            string result = "";
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");
            ManagementObjectCollection moCollection = searcher.Get();
            foreach (ManagementObject mObject in moCollection)
            {
                result += mObject["SerialNumber"].ToString() + " ";
            }
            return result;
        }

        /// <summary>
        /// 主板編號(hào)
        /// </summary>
        /// <returns></returns>
        public string GetMainBoardId()
        {
            string result = "";
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\CIMV2",
                    "SELECT * FROM Win32_BaseBoard");
            ManagementObjectCollection moCollection = searcher.Get();
            foreach (ManagementObject mObject in moCollection)
            {
                result += mObject["SerialNumber"].ToString() + " ";
            }
            return result;
        }

        /// <summary>
        /// 主板編號(hào)
        /// </summary>
        /// <returns></returns>
        public string GetNetworkAdapterId()
        {
            string result = "";
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT MACAddress FROM Win32_NetworkAdapter WHERE ((MACAddress Is Not NULL)AND (Manufacturer <> 'Microsoft'))");
            ManagementObjectCollection moCollection = searcher.Get();
            foreach (ManagementObject mObject in moCollection)
            {
                result += mObject["MACAddress"].ToString() + " ";
            }
            return result;
        }

        /// <summary>
        /// 主板編號(hào)
        /// </summary>
        /// <returns></returns>
        public string GetGroupName()
        {
            string result = "";
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_Group");
            ManagementObjectCollection moCollection = searcher.Get();
            foreach (ManagementObject mObject in moCollection)
            {
                result += mObject["Name"].ToString() + " ";
            }
            return result;
        }

        /// <summary>
        /// 獲取本地驅(qū)動(dòng)器信息
        /// </summary>
        /// <returns></returns>
        public string GetDriverInfo()
        {
            string result = "";
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_LogicalDisk");
            ManagementObjectCollection moCollection = searcher.Get();
            foreach (ManagementObject mObject in moCollection)
            {
                //mObject["DriveType"]共有6中可能值,分別代表如下意義:
                //1:No type   2:Floppy disk   3:Hard disk
                //4:Removable drive or network drive   5:CD-ROM   6:RAM disk
                //本處只列出固定驅(qū)動(dòng)器(硬盤分區(qū))的情況
                if (mObject["DriveType"].ToString() == "3")
                {
                    result += string.Format("Name={0},FileSystem={1},Size={2},FreeSpace={3} ", mObject["Name"].ToString(),
                        mObject["FileSystem"].ToString(), mObject["Size"].ToString(), mObject["FreeSpace"].ToString());
                }
            }
            return result;
        }
    }
}
程序的運(yùn)行結(jié)果如下(不同機(jī)器上的結(jié)果會(huì)不相同):


最后說明:雖然絕大部分Windows操作系統(tǒng)已經(jīng)安裝了WMI(根據(jù)微軟官方說法是自WinME以后的Windows系統(tǒng)包括WinME都安裝了),但是不能保證上面的代碼能在所有的Windows操作系統(tǒng)之上,如Win95之類,如果在不支持WMI的Windows系統(tǒng)上運(yùn)行WMI,那么需要從MSDN下載WMI。

另外,運(yùn)行WMI需要當(dāng)前Windows登錄用戶有一定的權(quán)限,由于本人開發(fā)時(shí)是以管理員的身份登錄并運(yùn)行程序的,所以沒有權(quán)限異常提示,但是我不保證代碼在你處運(yùn)行也正常,特別是在WebForm的環(huán)境下,因?yàn)閍sp.net程序默認(rèn)是較低的權(quán)限運(yùn)行的(安全原因)。

作者:未知 | 文章來源:未知 | 更新時(shí)間:2008-1-15 16:44:15

  • 上一篇文章:

  • 下一篇文章:

  • 相關(guān)文章:
    沒有相關(guān)文章
    軟件技術(shù)
    · 開發(fā)語(yǔ)言
    · Java技術(shù)
    · .Net技術(shù)
    · 數(shù)據(jù)庫(kù)開發(fā)
    最新文章  
    ·搜集整理的asp.net的驗(yàn)證方
    ·各種FOR循環(huán)結(jié)構(gòu)的整理
    ·軟件項(xiàng)目開發(fā)中應(yīng)該考慮那
    ·搜集整理的javascript sel
    ·軟件開發(fā)中項(xiàng)目經(jīng)理有那些
    ·學(xué)習(xí)如何在Lambda表達(dá)式進(jìn)
    ·C++基礎(chǔ)知識(shí):結(jié)構(gòu)體數(shù)據(jù)的
    ·C#實(shí)現(xiàn)短信發(fā)送程序的例子
    ·sun最近修補(bǔ)了一部分java的
    ·rss定制的另外一種實(shí)現(xiàn)方式
    ·delphi實(shí)現(xiàn)利用arp欺騙來實(shí)
    ·基礎(chǔ)學(xué)習(xí):基于WF的流程框
    ·網(wǎng)絡(luò)編程中怎樣得知一次數(shù)
    ·如何逆序輸出單鏈表?
    ·軟件開發(fā)過程中的性能設(shè)計(jì)
    關(guān)于我們 | 軟件開發(fā) | 下載試用 | 客服中心 | 聯(lián)系我們 | 友情鏈接 | 網(wǎng)站地圖 | 新疆電子地圖 | RSS訂閱
    版權(quán)所有 © 2016 新疆二域軟件開發(fā)網(wǎng) www.pg11qqq.com All Rights Reserved 新ICP備14003571號(hào)
    新疆軟件開發(fā)總機(jī):0991-4842803、4811639.
    客服QQ:596589785 ;地址:新疆烏魯木齊北京中路華聯(lián)大廈A-5C 郵編:830000