본문 바로가기
C#, C++, C

c# USB Serial Number (고유번호 가져오기, 특정 USB에서만 작동하게하기)

by 전재훈 2015. 9. 24.
반응형

USB 시리얼 넘버를 통해

특정 USB에서 작동하게 한다던지 

여러가지 응용이 가능합니다.


저는 특정 USB 에서 작동하게하기위해서 구현했는데요


1. 아래처럼 USBSerialNumber라는 클래스를 구현해줍니다.


using System;

using System.Collections.Generic;

using System.Text;

using System.Management;


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;

        }

    }


2. 이제 응용을 할 차롄데요. 저는 아래와 같은 함수를 만들어서 return 값에 따라 프로그램이 실행할지 종료할지 여부를 판단했습니다.


public Boolean deviceIdCheck()

        {

            //Serial 가져오기, drive에는 현재 프로그램이있는 드라이브( c 또는 d 또는 g .....)

            string drive = System.Environment.CurrentDirectory.Substring(0, 1);

            USBSerialNumber usb = new USBSerialNumber();

            string serial = usb.getSerialNumberFromDriveLetter(drive);

            if (serial == deviceId)

            {

                return true;

            }


            return false;

        }


반응형

'C#, C++, C' 카테고리의 다른 글

c# 프로그램 만료일자 설정  (1) 2015.09.24
C# 중복실행방지 mutex  (0) 2015.09.24
C# AES 암호화 / 복호화 예제 소스 코드  (3) 2014.07.08

댓글