Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/112: Рейтинг темы: голосов - 112, средняя оценка - 4.75
18 / 34 / 2
Регистрация: 28.01.2012
Сообщений: 181

Аппаратный серийный номер флешки (как долго я искал)

20.04.2012, 22:21. Показов 23115. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
нашел пример, которая вытаскивает аппаратный серийный номер флешки (наконец-то) не постесняюсь выложить код. Честно говоря у меня было такое ощущение, что люди постеснялись выложить код
но одна проблема встала: как мне серийный номер привязать к букве флешки?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <stdio.h>
#include <windows.h>
#include <Setupapi.h>
#include <devguid.h>
#include "conio.h"
#include "tchar.h"
//#include <devguid.h>
DEFINE_GUID( GUID_DEVCLASS_USB,0x36FC9E60, 0xC465, 0x11CF, 0x80, 0x56, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00 );
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HDEVINFO deviceInfoSet;
GUID *guidDev = (GUID*) &GUID_DEVCLASS_USB;
deviceInfoSet = SetupDiGetClassDevs(guidDev, NULL, NULL, DIGCF_PRESENT | DIGCF_PROFILE);
TCHAR buffer [4000];
int memberIndex = 0;
while (true)
        {
        SP_DEVINFO_DATA deviceInfoData;
        ZeroMemory(&deviceInfoData, sizeof(SP_DEVINFO_DATA));
        deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
        if (SetupDiEnumDeviceInfo(deviceInfoSet, memberIndex, &deviceInfoData) == FALSE)
                {
                if (GetLastError() == ERROR_NO_MORE_ITEMS)
                        {
                        break;
                        }
                }
        DWORD nSize=0 ;
        SetupDiGetDeviceInstanceId (deviceInfoSet, &deviceInfoData, buffer, sizeof(buffer), &nSize);
        buffer [nSize] ='\0';
        _tprintf (_T("%s\n"), buffer);
        memberIndex++;
        //Label1->Caption=String(buffer);
        if (String(buffer).SubString(1,8)=="USB\\VID_")
        ShowMessage(String(buffer));  // AnsiString dsa; dsa=dsa.SubString(dsa.Pos("USB\\"),)
        }
if (deviceInfoSet)
        {
        SetupDiDestroyDeviceInfoList(deviceInfoSet);
        }
        
}
//---------------------------------------------------------------------------
программа возвращает VID, PID и серийный номер в виде USB\VID_XXXX_PID_YYYY\ZZZZ, где XXXX-VID, YYYY-PID, ZZZZ-Серийный номер (Аппаратный!!!!!! который я так долго искал)
Программный серийный номер можно легко достать функцией GetVolumeInformation
11
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.04.2012, 22:21
Ответы с готовыми решениями:

Определить аппаратный серийный номер флешки
Как определить аппаратный серийный номер флешки, именно НЕ серийный номер тома. В интернете масса вариантов но все они именно на...

Аппаратный серийный номер флэш накопителя
Здравствуйте! Как можно считать аппаратный серийный номер с флэшки? Функция Getvolumeinformation не подходит так как это серийник тома ии...

Как считывать серийный номер флешки
Здраствуйте, как считывать серийный номер флешок?

9
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
21.04.2012, 00:16
Dondok, а можно комментарий к вашему коду?
0
18 / 34 / 2
Регистрация: 28.01.2012
Сообщений: 181
21.04.2012, 00:30  [ТС]
EdarGp, это не мой код. Где-то в интернете нашел, уже не помню. Как я понял перечисляет все устройства и выдает информацию. Но я там в конце еще поставил условие чтобы отображать только USB-устройства
C++
1
if (String(buffer).SubString(1,8)=="USB\\VID_") ShowMessage(String(buffer));
в buffer перечисляет все устройства. я как бы фильтр поставил.

Добавлено через 5 минут
теперь появилась другая проблема!!!
Надо как то информацию об USB-устройствах как-то привязать к буквам флешек. Например, допустим что подключено 2 USB и можно же перепутать серийные номера, так что надо как-то установить жесткую связь. Кто знает помогите... мне кажется функциями серии SetupDI***** как-то можно сделать, только какими???
0
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
23.04.2012, 00:31
а вы уверены что номер получаете правильно?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.04.2012, 01:32
Сходится

Странно что у мыши находит серийник, а специальная программка нет
1
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
23.04.2012, 09:28
Лучший ответ Сообщение было отмечено как решение

Решение

нашел пример, которая вытаскивает аппаратный серийный номер флешки (наконец-то) не постесняюсь выложить код. Честно говоря у меня было такое ощущение, что люди постеснялись выложить код
...................
Вложения
Тип файла: pdf Мини HASP ключ из любого устройства USB (Минск).pdf (155.9 Кб, 1431 просмотров)
5
0 / 0 / 0
Регистрация: 11.03.2014
Сообщений: 22
19.06.2014, 13:16
Dondok,
вы нашли ответ на вопрос "как мне серийный номер привязать к букве флешки?" - тоже очень интересуюсь
0
18 / 34 / 2
Регистрация: 28.01.2012
Сообщений: 181
21.06.2014, 13:56  [ТС]
Нет к сожалению. Надо копать в сторону исходника винды. Допустим для безопасного извлечения флешки винда же как то связывает букву с серийником.
Если хорошо искать то можно найти в интернете исходник винды, но это будет нарушением прав компании майкрософт. Так что думайте сами
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
21.06.2014, 16:04
LaVie, посмотрите здесь (и плюсик ISergey обязательно поставьте)
Получить пути к USB накопителям

Возможно, существует еще лучшее решение (через какой-нибудь IOCTL),
но я такого не знаю. Кстати, Windows ведь умеет это делать (свойства диска - тома),
но как именно - неизвестно. Можно в отладчике посмотреть или через
какой-нибудь API Hook...

Цитата Сообщение от Dondok Посмотреть сообщение
Если хорошо искать то можно найти в интернете исходник винды, но это будет нарушением прав компании майкрософт.
Можно вполне легально скачать WRK по какой-нибудь программе.
Только вряд ли вы там найдете искомое, как и в старых сорцах NT4/Win2k...
1
188 / 120 / 4
Регистрация: 23.01.2010
Сообщений: 1,320
24.09.2016, 23:07
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
 public partial class РегНовКлюча : Form
    {
        public РегНовКлюча()
        {
            InitializeComponent();
        }
 
 
        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 parseVenFromDeviceID(string deviceId)
        {
            string[] splitDeviceId = deviceId.Split('\\');
            string Ven;
            //Разбиваем строку на несколько частей. 
            //Каждая чаcть отделяется по символу &
            string[] splitVen = splitDeviceId[1].Split('&');
 
            Ven = splitVen[1].Replace("VEN_", "");
            Ven = Ven.Replace("_", " ");
            return Ven;
        }
 
        private string parseProdFromDeviceID(string deviceId)
        {
            string[] splitDeviceId = deviceId.Split('\\');
            string Prod;
            //Разбиваем строку на несколько частей. 
            //Каждая чаcть отделяется по символу &
            string[] splitProd = splitDeviceId[1].Split('&');
 
            Prod = splitProd[2].Replace("PROD_", ""); ;
            Prod = Prod.Replace("_", " ");
            return Prod;
        }
 
        private string parseRevFromDeviceID(string deviceId)
        {
            string[] splitDeviceId = deviceId.Split('\\');
            string Rev;
            //Разбиваем строку на несколько частей. 
            //Каждая чаcть отделяется по символу &
            string[] splitRev = splitDeviceId[1].Split('&');
 
            Rev = splitRev[3].Replace("REV_", ""); ;
            Rev = Rev.Replace("_", " ");
            return Rev;
        }
 
 
 
private void button1_Click(object sender, EventArgs e)
        {
 
 
 
            string diskName = string.Empty;
 
 //Получение списка накопителей подключенных через интерфейс USB
            foreach (System.Management.ManagementObject drive in
                      new System.Management.ManagementObjectSearcher(
                       "select * from Win32_DiskDrive where InterfaceType='USB'").Get())
            {
                //Получаем букву накопителя
                foreach (System.Management.ManagementObject partition in
                new System.Management.ManagementObjectSearcher(
                    "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" + drive["DeviceID"]
                      + "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition").Get())
                {
                    foreach (System.Management.ManagementObject disk in
                 new System.Management.ManagementObjectSearcher(
                        "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='"
                          + partition["DeviceID"]
                          + "'} WHERE AssocClass = Win32_LogicalDiskToPartition").Get())
                    {
                        //Получение буквы устройства
                        diskName = disk["Name"].ToString().Trim();
                        // listBox1.Items.Add("Буква накопителя=" + diskName);
                    }
                }
 
 textBox1.Text = drive["Model"].ToString();
 
 
 textBox2.Text = parseVenFromDeviceID(drive["PNPDeviceID"].ToString().Trim());
 
 textBox3.Text = parseProdFromDeviceID(drive["PNPDeviceID"].ToString().Trim());
 
 
 textBox7.Text = parseRevFromDeviceID(drive["PNPDeviceID"].ToString().Trim());
 
textBox5.Text = parseSerialFromDeviceID(drive["PNPDeviceID"].ToString().Trim());
 
 
 }
 
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.09.2016, 23:07
Помогаю со студенческими работами здесь

серийный номер флешки
Подскажите, можно ли вообще узнать програмным путем (C#) серийный номер флешки? И если можно, то как?

Серийный номер флешки
ManagementObjectSearcher theSearcher = new ManagementObjectSearcher(&quot;SELECT * FROM Win32_DiskDrive WHERE InterfaceType='USB'&quot;); ...

Серийный номер флешки
Нужно узнать физический серийник флэшки. GetVolumeInformation - возвращает серийный номер тома, который меняется при форматировании. ...

Узнать серийный номер флешки
Всем привет, нужна помощь. Как узнать серийный номер флешки средствами VB, так же как запретить запуск приложения если серийный номер не...

Серийный номер USB флешки
Доброе время суток помогите исходничком, необходимо при нажатии на кнопку в эдите выдовало Серийный номер USB флешки.Заранее спасибо


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru