博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
『原创』+『参考』使用WMI在C#下获取U盘的永久不变的物理序列号
阅读量:6986 次
发布时间:2019-06-27

本文共 2565 字,大约阅读时间需要 8 分钟。

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

转载地址:http://yjqpl.baihongyu.com/

你可能感兴趣的文章
Javascript如何实现GPU加速?
查看>>
次世代的会话管理项目 Spring Session
查看>>
SQL SERVER 2008安全配置
查看>>
Json hijacking/Json劫持漏洞
查看>>
onTouch 事件传递
查看>>
算法知识梳理(5) 数组第二部分
查看>>
多页应用增量更新静态资源Webpack打包方案
查看>>
ionic V3.3开发踩坑集锦
查看>>
对RecyclerView中使用Adapter中的一点思考(RecyclerView 多布局)
查看>>
Realm入门指北
查看>>
为提升应用品质助力,绿标2.0检测项技术详解
查看>>
JavaScript 专题之偏函数
查看>>
说说 Vue.js 组件的高级特性-续篇
查看>>
说说如何搭建 Activiti 开发环境
查看>>
一个简单的加载动画(一)
查看>>
一个轻量级的数据驱动列表框架 YHListKit
查看>>
启动页
查看>>
微信红包的随机算法是怎样实现的?
查看>>
underscorejs源码学习系列(未完,更新中)
查看>>
Java 8 Lambda表达式一看就会
查看>>