『原創』+『參考』使用WMI在C#下擷取隨身碟的永久不變的物理序號

來源:互聯網
上載者:User

  近幾天想做個只能在優盤裡使用的程式,查了很多相關的擷取優盤物理序號的文章,發現基本沒有幾個現存的,於是就從一英文網站抄了個過來,原文名稱:Retrieving Non-Volatile USB Serial Number Using C# .NET,大家英文好的可以直接看原文。

  百分之九十九的優盤其實都有一個 OEM serial number.

  一般來說,Windows為其分配的邏輯序號容易因為格式化或量化工具而丟失,如果不能擷取優盤的永遠不變的物理序號,意味著就無法使用優盤等USB裝置來做安全工具,本文即來解決這個問題,使無論優盤是格式化後還是採用特殊處理,其OEM物理序號不會丟失。常用的有兩種方法:使用註冊表或使用Win32 WMI Provider. 有關WMI的介紹及說明,請查閱相關說明,已經很多了,本文使用了WMI的方法:

  首先在C#裡添加對 SYSTEM.MANAGEMENT的引用,然後你就可以直接使用下面的代碼了,一看就懂了。

  

USBSerialNumber
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;

namespace USBSNTest
{
    public class USBSerialNumber
    {
        string _serialNumber;
        string _driveLetter;

        public string getSerialNumberFromDriveLetter(string driveLetter)
        {
            this._driveLetter = driveLetter.ToUpper();

            if (!this._driveLetter.Contains(":"))
            {
                this._driveLetter += ":";
            }

            matchDriveLetterWithSerial();

            return this._serialNumber;
        }

        private void matchDriveLetterWithSerial()
        {

            string[] diskArray;
            string driveNumber;
            string driveLetter;

            ManagementObjectSearcher searcher1 = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDiskToPartition");
            foreach (ManagementObject dm in searcher1.Get())
            {
                diskArray = null;
                driveLetter = getValueInQuotes(dm["Dependent"].ToString());
                diskArray = getValueInQuotes(dm["Antecedent"].ToString()).Split(',');
                driveNumber = diskArray[0].Remove(0, 6).Trim();
                if (driveLetter == this._driveLetter)
                {
                    /* This is where we get the drive serial */
                    ManagementObjectSearcher disks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
                    foreach (ManagementObject disk in disks.Get())
                    {

                        if (disk["Name"].ToString() == ("\\\\.\\PHYSICALDRIVE" + driveNumber) & disk["InterfaceType"].ToString() == "USB")
                        {
                            this._serialNumber = parseSerialFromDeviceID(disk["PNPDeviceID"].ToString());
                        }
                    }
                }
            }
        }

        private string parseSerialFromDeviceID(string deviceId)
        {
            string[] splitDeviceId = deviceId.Split('\\');
            string[] serialArray;
            string serial;
            int arrayLen = splitDeviceId.Length - 1;

            serialArray = splitDeviceId[arrayLen].Split('&');
            serial = serialArray[0];

            return serial;
        }

        private string getValueInQuotes(string inValue)
        {
            string parsedValue = "";

            int posFoundStart = 0;
            int posFoundEnd = 0;

            posFoundStart = inValue.IndexOf("\"");
            posFoundEnd = inValue.IndexOf("\"", posFoundStart + 1);

            parsedValue = inValue.Substring(posFoundStart + 1, (posFoundEnd - posFoundStart) - 1);

            return parsedValue;
        }

    }
}

 

  最後,調用方法如下:

 

USBSerialNumber usbSN = new USBSerialNumber();
textBox3.Text = usbSN.getSerialNumberFromDriveLetter("I");//I為我機器上的隨身碟盤符,可以自己定義,但是一定要是機器上正在運轉的隨身碟哦
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.