Дізнатися серійний номер флешки

Якось встала переді мною завдання - написати програму-сторож, що дозволяє використовувати тільки дозволені USB-флешки на певних комп'ютерах. Прив'язку вирішив робити до серійного номеру. а так же VID і PID флешки (Vendor ID і Part ID), що в загальному випадку можна вважати унікальною інформацією.

Я зараз не розглядаю способи перепрошивки флешок під довільний VID, PID, Serial, це все можна зробити, підібравши відповідну утилітки під виробника контролера.

Отже, нависла завдання дізнатися всю потрібну інформацію. Зараз я не буду розглядати розробку цілого додатки, покажу лише основну функцію. Буду навіть радий, якщо хтось допоможе доопрацювати програму. Та й сам я буду постійно покращувати і модернізувати цей код.

Отже, для вибору даних скористаємося моїм улюбленим WMI (Windows Management Instrumentation). Чому воно мені подобається? Та тому що все працює "з коробки", не потрібно встановлювати додаткові програми і компоненти і є безліч класів.

Як працювати з технологією - подивіться по тегам WMI, WMIC, а я розповідаю далі.

Виколупувати дані буде з рядка ідентифікатора пристрою, яка виглядає як-то так:

У цьому рядку є VID, PID і серійний номер після другої косою риси.

Важливо не переплутати серійний номер флешки і серійний номер тому. Останній (можна отримати командою dir) змінюється при форматуванні флешки і ніяк не годиться для унікальної ідентифікації.

Механізм отримання серійного номера флешки

Тепер завдання - отримати рядок цю.

Засобами WMI ми отримуємо цю інформацію з класу Win32_usbhub. оголошеного в просторі \\ root \ cimv2

Отже, запускаємо командний рядок, там програму wmic.

Дізнатися серійний номер флешки

Пишемо там команду вибору поля DeviceID з класу Win32_usbhub. Забігаючи вперед скажу, що вдасться багато пристроїв (кореневі концентратори, миша і т.д.,) тому я відразу напишу фільтр по запам'ятовуючим пристроям.

wmic: root \ cli> path win32_usbhub Where (Caption = "Оперативна пам'ять для USB") get DeviceID

Дізнатися серійний номер флешки

wmic path get where

Ось і отримали наші заповітні рядки. Парсити їх доведеться вже іншими засобами.

До речі, ось напрацювання на Delphi, кому-то може це стане в нагоді.

Код, звичайно, грубуватий, але зібраний на коліні. Головне - працює. Користуйтеся, якщо потрібно:

Дізнатися серійний номер флешки

Завантажити проект з виконуваним файлом можна за посиланням

Таким чином, використовуючи WMI ми отримали серійний номер флешки. а так само додаткову інформацію у вигляді VID і PID.

А чи можна якось змінити серійний номер флешки?

Так можна. Є програми-прошівальщік (під кожен чіп своя програма), які можна використовувати для зміни серійного номера і VID PID ідентифікаторів. Наприклад, для чіпів Alcor я використовую Alcor Change Vid Pid Rework.

Дізнатися серійний номер флешки

Зміна серійного номера флешки

Дізнатися серійний номер флешки

Зміна серійного номера флешки

Дізнатися серійний номер флешки

Зміна серійного номера флешки

Змінити серійний номер флешки нескладно. Підключаємо флешку, вибираємо її в порту в списку. Натискаємо Setup (відкривається вікно на фотках вище) вводить потрібні VID PID і SN і тиснемо кнопку START. Флешка готова через секунду з новим серійним номером.

До речі, я вже писав раніше, як можна відформатувати флешку в ntfs - це може виявитися корисним!

Вам так само сподобається:

У цьому коді ніяк. Але можна скористатися додатково іншим WMI класом. win32_diskdrive
Для порівняння, виконайте команду в командному рядку з вставленої флешкою:
> Wmic path win32_diskdrive get pnpdeviceid, size

Побачите схожу рядок серійного номера, а так же розмір в байтах.
Потрібно тільки виділити серійний номер, знайти його в одній з цих рядків, а так же видати розмір в байтах (попередньо перерахувати, наприклад в МБ).

Привіт, не могли б ви мені підказати, я повісив вашу функцію на подію WM_DEVICECHANGE, а точніше на повідомлення DBT_DEVICEARRIVAL, тобто коли флешку тільки вставили мені потрібно відразу дізнатися її серійний номер, в результаті вискакує помилка
"Неможливо виконати вихідний дзвінок, так як додаток обробляє вхідний синхронний виклик."
Затримка на 5 секунд рятує, але, може, якось можна виправити цю помилку?
Заздалегідь дякую.

@litladmin. Ось код:
procedure DEVICECHANGE (var Msg: TMessage); message WM_DEVICECHANGE;

procedure TForm1.DEVICECHANGE (var Msg: TMessage);
var
Enumerator: IEnumVariant;
WbemLocator, WbemServices, WbemObjectSet. Variant;
Properties. IEnumVariant;
Property1, System. OleVariant;
j. LongWord;
sProperty. string;
Vid, Pid, ​​Serial. ShortString;
begin
case Msg.WParam of
DBT_DEVICEARRIVAL:
begin
Label1.Caption: = 'Flash change';

За статтю спасибі, постараюся розібратися.