『原创』+『参考』使用WMI在C#下获取U盘的永久不变的物理序列号
生活随笔
收集整理的這篇文章主要介紹了
『原创』+『参考』使用WMI在C#下获取U盘的永久不变的物理序列号
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
近幾天想做個只能在優盤里使用的程序,查了很多相關的獲取優盤物理序列號的文章,發現基本沒有幾個現存的,于是就從一英文網站抄了個過來,原文名稱: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為我機器上的U盤盤符,可以自己定義,但是一定要是機器上正在運轉的U盤哦
總結
以上是生活随笔為你收集整理的『原创』+『参考』使用WMI在C#下获取U盘的永久不变的物理序列号的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端框架_Vue
- 下一篇: 【洛谷3377】 左偏树(可并堆)