Дізнатися серійний номер флешки
Якось встала переді мною завдання - написати програму-сторож, що дозволяє використовувати тільки дозволені 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';
За статтю спасибі, постараюся розібратися.