none
Флешка RRS feed

  • Вопрос

  • Здраствуйте. Я живу в очень красивом городе Бендеры, это маленький городок которой расположен в Приднестровье. У нас каждый год проходит ярмарка на День Города, я хотел там продавать свои, к сожелению в этом году неполучаться,  но в следующем году думаю получиться я бы хотел распространять свои программы на флешках. Подскажите как получить индентификационные данные флешки т.е. серийный номер на с#.
    13 сентября 2014 г. 19:17

Ответы

  • Добрый день,

    получить серийный номер можно, но если честно, то привязка .Net программы к серийнику флешки плохая идея. Обходится элементарно... Вообще защита .Net приложения отдельная тема для обсуждения.

    А получить номер можем так:

    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 usb = new USBSerialNumber();
    string serial = usb.getSerialNumberFromDriveLetter("f:\");
    MessageBox.Show(serial);

    Или так:

    //using System.Management namespace
    //далее 
    ManagementObjectSearch theSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE InterfaceType='USB'");
    foreach (ManagementObject currentObject in theSearcher.Get())
    {
       ManagementObject theSerialNumberObjectQuery = new ManagementObject("Win32_PhysicalMedia.Tag='" + currentObject["DeviceID"] + "'");
       MessageBox.Show(theSerialNumberObjectQuery["SerialNumber"].ToString());
    }
    

    15 сентября 2014 г. 0:45

Все ответы

  • Лет 10 назад за такой информацией я бы полез в "Практика программирования USB" Агурова. Но тогда Bing`а ещё не было.


    13 сентября 2014 г. 19:44
  • Лет 10 назад за такой информацией я бы полез в "Практика программирования USB" Агурова. Но тогда Bing`а ещё не было.


    У меня под рукой есть yandex, Google, rambler. Если нет ответа то нет его с нормальным понимаем, если не понемаеш то поразмышляй над Пушкиным, думаю ты и в Bing найдеш ответ на вопрос. А меня интересует просто код доступа к флэшке. Я слышал что Bil, не приветствует лентяев.

    14 сентября 2014 г. 10:09
  • Добрый день, думаю эта статья хоть немного но прояснит ситуацию http://www.codeproject.com/Articles/63878/Enumerate-and-Auto-Detect-USB-Drives

    [Блог] [Twitter]

    14 сентября 2014 г. 10:40
  •  А меня интересует просто код доступа к флэшке. Я слышал что Bil, не приветствует лентяев.

    Не знаю кто такой Bil, но в той книжке, название которой есть выше, имеется табличка с описанием прилагающегося компакт - диска, на котором есть просто код доступа к флешке. Но это не для лентяев, да.
    14 сентября 2014 г. 12:20
  • Добрый день,

    получить серийный номер можно, но если честно, то привязка .Net программы к серийнику флешки плохая идея. Обходится элементарно... Вообще защита .Net приложения отдельная тема для обсуждения.

    А получить номер можем так:

    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 usb = new USBSerialNumber();
    string serial = usb.getSerialNumberFromDriveLetter("f:\");
    MessageBox.Show(serial);

    Или так:

    //using System.Management namespace
    //далее 
    ManagementObjectSearch theSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE InterfaceType='USB'");
    foreach (ManagementObject currentObject in theSearcher.Get())
    {
       ManagementObject theSerialNumberObjectQuery = new ManagementObject("Win32_PhysicalMedia.Tag='" + currentObject["DeviceID"] + "'");
       MessageBox.Show(theSerialNumberObjectQuery["SerialNumber"].ToString());
    }
    

    15 сентября 2014 г. 0:45