C#获取U盘序列号和盘符

private List<string> _serialNumber = new List<string>();
 private void matchDriveLetterWithSerial()
        {
            string[] diskArray;
            string driveNumber;
            var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDiskToPartition");
            foreach (ManagementObject item in searcher.Get())
            {
                string _driveletter = getValueInQuotes(item["Dependent"].ToString());               
                diskArray = getValueInQuotes(item["Antecedent"].ToString()).Split(',');
                driveNumber = diskArray[0].Remove(0, 6).Trim();
                var disks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
                foreach (ManagementObject disk in disks.Get())
                {
                    if (disk["Name"].ToString() == ("\\\\.\\PHYSICALDRIVE" + driveNumber) &&
                        disk["interfaceType"].ToString() =="USB")
                    {
                        _serialNumber.Add(parseSerialFromDeviceID(disk["PNPDeviceID"].ToString()));
                        Console.Write(disk["SerialNumber"].ToString());
                        Console.Write(_driveletter);                       
                    }
                }
            }
        }

        private static string getValueInQuotes(string invalue)
        {
            var posFoundStart = invalue.IndexOf("\"");
            var posFoundEnd = invalue.IndexOf("\"", posFoundStart + 1);
            string posValue = invalue.Substring(posFoundStart + 1, posFoundEnd - (posFoundStart + 1));
            return posValue;
        }
        
        private static string parseSerialFromDeviceID(string deviceid)
        {
            var splitDeviceId = deviceid.Split('\\');
            var arrayLen = splitDeviceId.Length - 1;
            var serialArray = splitDeviceId[arrayLen].Split('&');
            var serial = serialArray[0];
            return serial;
        }

        [DllImport("kernel32.dll",SetLastError = true,CharSet = CharSet.Auto)]
        private static extern IntPtr CreateFile(
            string lpFileName,
            uint dwDesireAccess,
            uint dwShareMode,
            IntPtr SecurityAttributes,
            uint dwCreateionDisposition,
            uint dwFlagsAndAttributes,
            IntPtr hTemplateFile
            );
        [DllImport("kernel32.dll")]
        private static extern int GetVolumeInformation(
            string lpRootPathName,
            string lpVolumeNameBuffer,
            int nVolumeNameSize,
            ref int lpVolumeSerialNumber,
            int lpMaximumComponentLength,
            int lpFileSystemFlags,
            string lpFileSystemNameBuffer,
            int nFileSystemNameSize
            );
        [DllImport("kernel32.dll", ExactSpelling = true, SetLastError = true, CharSet = CharSet.Auto)]
        private static extern bool DeviceIoControl(
            IntPtr hDevice,
            uint dwIoControlCode,
            IntPtr lpInBuffer,
            uint nInBufferSize,
            IntPtr lpOutBuffer,
            uint nOutBufferSize,
            out uint lpBytesReturned,
            IntPtr lpOverlapped
            );

        [DllImport("CfgMgr32.dll", SetLastError = true)]
        private static extern int CM_Enable_DevNode(ref IntPtr hDevice, int ulFlags);
        [DllImport("CfgMgr32.dll", SetLastError = true)]
        private static extern int CM_Disable_DevNode(ref IntPtr hDevice,int ulFlags);
        
        public const uint GENERIC_READ = 0x80000000;
        public const int GENERIC_WRITE = 0x40000000;
        public const int FILE_SHARE_READ = 0x1;
        public const int FILE_SHARE_WRITE = 0x2;
        public const int IOCTL_STORAGE_EJECT_MEDIA = 0x2d4808;
        //删除U盘
        private bool RemoveUsbDevice(string drvID)
        {
            //设备驱动的设备路径形式固定为"\\.\\DeviceName",如"\\.\I"
            string fileName = @"\\.\" + drvID.Remove(2);
            IntPtr handle = CreateFile(fileName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,IntPtr.Zero,0x03,0,IntPtr.Zero);
            uint byteReturned;
            bool result = DeviceIoControl(handle, IOCTL_STORAGE_EJECT_MEDIA, IntPtr.Zero, 0, IntPtr.Zero, 0, out byteReturned, IntPtr.Zero);
            return result;
        }

        //定义常量
        public const int WM_DEVICECHANGE = 0x219;
        public const int DBT_DEVICEARRIVAL = 0x8000;
        public const int DBT_CONFIGCHANGECANCELED = 0x0019;
        public const int DBT_CONFIGCHANGED = 0x0018;
        public const int DBT_CUSTOMEVENT = 0x8006;
        public const int DBT_DEVICEQUERYREMOVE = 0x8001;
        public const int DBT_DEVICEQUERYREMOVEFAILED = 0x8002;
        public const int DBT_DEVICEREMOVECOMPLETE = 0x8004;
        public const int DBT_DEVICEREMOVEPENDING = 0x8003;
        public const int DBT_DEVICETYPESPECIFIC = 0x8005;
        public const int DBT_DEVNODES_CHANGED = 0x0007;
        public const int DBT_QUERYCHANGECONFIG = 0x0017;
        public const int DBT_USERDEFINED = 0xFFFF;

        protected override void WndProc(ref Message m)
        {
            try
            {
                if (m.Msg == WM_DEVICECHANGE)
                {
                    switch (m.WParam.ToInt32())
                    {
                        case WM_DEVICECHANGE:
                            break;
                        case DBT_DEVICEARRIVAL:
                            DriveInfo[] s = DriveInfo.GetDrives();
                            foreach (DriveInfo drive in s)
                            {
                                if (drive.DriveType == DriveType.Removable)
                                {
                                    string tempSal = HDVal(drive.Name.ToString());
                                    this.richTextBox1.AppendText("U盘已插入,盘符是" + drive.Name.ToString() + " " + tempSal + "\r\n");
                                    if (checkBox1.Checked == true)
                                    {
                                        _serialNumber.Add(tempSal);
                                    }
                                    else
                                    {
                                        if (!_serialNumber.Exists(e => e==tempSal))
                                        {
                                            bool result = RemoveUsbDevice(drive.Name.ToString());
                                            if (result)
                                            {
                                                //CM_Disable_DevNode(ref handle, 0x02);
                                                //CM_Enable_DevNode(ref handle, 0);
                                            }
                                        }                                        
                                    }
                                    break;
                                }
                            }
                            break;
                        case DBT_CONFIGCHANGECANCELED:
                            //MessageBox.Show("2");
                            break;
                        case DBT_CONFIGCHANGED:
                            //MessageBox.Show("3");
                            break;
                        case DBT_CUSTOMEVENT:
                            //MessageBox.Show("4");
                            break;
                        case DBT_DEVICEQUERYREMOVE:
                            //MessageBox.Show("5");
                            break;
                        case DBT_DEVICEQUERYREMOVEFAILED:
                            //MessageBox.Show("6");
                            break;
                        case DBT_DEVICEREMOVECOMPLETE:
                            this.richTextBox1.AppendText("U盘已卸载" + "\r\n");
                            break;
                        case DBT_DEVICEREMOVEPENDING:
                            //MessageBox.Show("7");
                            break;
                        case DBT_DEVICETYPESPECIFIC:
                            //MessageBox.Show("8");
                            break;
                        case DBT_DEVNODES_CHANGED:
                            //MessageBox.Show("9");
                            break;
                        case DBT_QUERYCHANGECONFIG:
                            //MessageBox.Show("10");
                            break;
                        case DBT_USERDEFINED:
                            //MessageBox.Show("11");
                            break;
                        default:
                            break;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            } 
            base.WndProc(ref m);
        }


        private string HDVal(string drvID)
        {
            const int MAX_FILENAME_LEN = 256;
            int retVal = 0;
            int a = 0;
            int b = 0;
            string str1 = null;
            string str2 = null;
            int i = GetVolumeInformation(
            drvID,
            str1,
            MAX_FILENAME_LEN,
            ref retVal,
            a,
            b,
            str2,
            MAX_FILENAME_LEN
            );
            return retVal.ToString();
        }

 

获取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、付费专栏及课程。

余额充值