近几天想做个只能在优盘里使用的程序,查了很多相关的获取优盘物理序列号的文章,发现基本没有几个现存的,于是就从一英文网站抄了个过来,原文名称: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盘哦