『原创』+『参考』使用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的引用,然后你就可以直接使用下面的代码了,一看就懂了。

  

ContractedBlock.gif ExpandedBlockStart.gif 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(06).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盘哦
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
获取U盘ID序列号 VS2005编译通过,源码源自CSDN。已经测试好用。 可以获得U盘名称,制造商ID号 版本号 U盘序列号及容量 Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Management; namespace UDiskTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button2_Click(object sender, EventArgs e) { DriveInfo[] s = DriveInfo.GetDrives(); foreach (DriveInfo drive in s) { if (drive.DriveType == DriveType.Removable) { pf.Text = drive.Name.ToString(); break; } } ManagementClass cimobject = new ManagementClass("Win32_DiskDrive"); ManagementObjectCollection moc = cimobject.GetInstances(); foreach (ManagementObject mo in moc) { if (mo.Properties["InterfaceType"].Value.ToString() == "USB") { try { //产品名称 Caption.Text = mo.Properties["Caption"].Value.ToString(); //总容量 Size.Text = mo.Properties["Size"].Value.ToString(); string[] info = mo.Properties["PNPDeviceID"].Value.ToString().Split('&'); string[] xx = info[3].Split('\\'); //序列号 MessageBox.Show("U盘序列号:" + xx[1]); PNPDeviceID.Text = xx[1]; xx = xx[0].Split('_'); //版本号 REV.Text = xx[1]; //制造商ID xx = info[1].Split('_'); VID.Text = xx[1]; } catch (Exception ex) { MessageBox.Show(ex.Message); } } } } } } 如果编译遇到问题是using System.Management;无法找到引用找到, 项目(p)->添加引用(R)->找到.NET标签页 列表中下部位找到System.Management 双击点确定

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值