Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.51/70: Рейтинг темы: голосов - 70, средняя оценка - 4.51
Dondok
18 / 34 / 2
Регистрация: 28.01.2012
Сообщений: 181
1

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

20.04.2012, 22:21. Просмотров 14028. Ответов 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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2012, 22:21
Ответы с готовыми решениями:

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

Как вывести серийный номер батареи
Здесь нашел как вывести серийный номер...

Как узнать серийный номер материнской платы на C++ Builder Xe
Всем привет . Хотел спросить как узнать серийный номер материнской платы . Так как чтоб привязать...

Получить аппаратный номер диска
Добрый день! Пишу программу инвентаризации. Ничего сильно сложного в программе не нужно. Почти...

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

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

Добавлено через 5 минут
теперь появилась другая проблема!!!
Надо как то информацию об USB-устройствах как-то привязать к буквам флешек. Например, допустим что подключено 2 USB и можно же перепутать серийные номера, так что надо как-то установить жесткую связь. Кто знает помогите... мне кажется функциями серии SetupDI***** как-то можно сделать, только какими???
0
Ddv122
Почемучка)
1240 / 300 / 30
Регистрация: 23.12.2010
Сообщений: 2,000
Записей в блоге: 1
23.04.2012, 00:31 4
а вы уверены что номер получаете правильно?
0
23.04.2012, 00:31
Avazart
Нарушитель
Эксперт С++
7902 / 5727 / 564
Регистрация: 10.12.2010
Сообщений: 26,214
Записей в блоге: 17
23.04.2012, 01:32 5
Сходится
Аппаратный серийный номер флешки (как долго я искал)

Странно что у мыши находит серийник, а специальная программка нет
Аппаратный серийный номер флешки (как долго я искал)
1
raxp
10190 / 6573 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
23.04.2012, 09:28 6
Лучший ответ Сообщение было отмечено как решение

Решение

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

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

Цитата Сообщение от Dondok Посмотреть сообщение
Если хорошо искать то можно найти в интернете исходник винды, но это будет нарушением прав компании майкрософт.
Можно вполне легально скачать WRK по какой-нибудь программе.
Только вряд ли вы там найдете искомое, как и в старых сорцах NT4/Win2k...
1
n971030
154 / 101 / 4
Регистрация: 23.01.2010
Сообщений: 1,317
24.09.2016, 23:07 10
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
24.09.2016, 23:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2016, 23:07

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

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru