-
Доброго времени суток. Помогите пожалуйста, необходимо программно получить серийный номер носителя (VolumeSerialNumber) не подходит. Нужен тот, который зашили производители. Сам не нашел. Может кто что-нибудь полезное подскажет?
-
-
Спасибо, но меня по большей части интересует USB подключение...
-
Чего подключаем ? Если USB Flash, то код экземпляра устройства (например USBSTOR\DISK&VEN_KINGSTON&PROD_DATATRAVELER_2.0&REV_1.00\81100000000000000000001 E&0 ) содержит в себе серийный номер (81100000000000000000001E). Только советую сначала проверить, отличается ли серийный номер разных флешек из одной партии. А то китайцы - народ своеобразный...
-
-
В общем программа должна блокировать USB носители, если она не находит в базе, на удаленном сервере, знакомый ей ID. Как связать её с серваком проблем нет, а вот вытащить серийник для меня сложность. Вытащил недавно код: function GetFlashDrivesCountA: Integer;
var
reg: TRegistry;
devices: TStringList;
i: integer;
usbRegKey:string;
begin
usbRegKey:='\SYSTEM\CurrentControlSet\Enum\';
Result:=0;
reg := TRegistry.Create;
devices := TStringList.Create;
try
reg.RootKey := HKEY_LOCAL_MACHINE;
if reg.OpenKey(usbRegKey, false) then
begin
reg.GetKeyNames(devices);
for i:=0 to devices.Count-1 do
if ExtractWord(2, devices[i], ['#','&']) = 'USBSTOR' then
begin
if reg.OpenKey(usbRegKey+'\'+devices[i]+'\#\Control',false) then
try
if reg.ReadInteger('Linked')=1 then
inc(Result);
except end;
end;
end
finally
reg.free;
devices.free;
end;
end;
function GetFlashDriveSN(num: integer): shortstring;
var
reg: TRegistry;
devices: TStringList;
i, j: integer;
begin
Result:='';
j:=0;
reg := TRegistry.Create;
devices := TStringList.Create;
try
reg.RootKey := HKEY_LOCAL_MACHINE;
if reg.OpenKey(usbRegKey, false) then
begin
reg.GetKeyNames(devices);
for i:=0 to devices.Count-1 do
if ExtractWord(2, devices[i], ['#','&']) = 'USBSTOR' then
begin
if reg.OpenKey(usbRegKey+'\'+devices[i]+'\#\Control',false) then
try
if reg.ReadInteger('Linked')=1 then
begin
inc(j);
if j=num then
begin
result := ExtractWord(7, devices[i], ['#','&']);
break;
end;
end;
except end;
end;
end
finally
reg.free;
devices.free;
end;
end;
function ExistsFlashWithSerialA(serial: shortstring): boolean;
var
reg: TRegistry;
devices: TStringList;
i: integer;
begin
Result:= false;
reg := TRegistry.Create;
devices := TStringList.Create;
try
reg.RootKey := HKEY_LOCAL_MACHINE;
if reg.OpenKey(usbRegKey, false) then
begin
reg.GetKeyNames(devices);
for i:=0 to devices.Count-1 do
if ExtractWord(2, devices[i], ['#','&']) = 'USBSTOR' then
begin
if reg.OpenKey(usbRegKey+'\'+devices[i]+'\#\Control',false) then
try
if reg.ReadInteger('Linked')=1 then
if Trim(ExtractWord(7, devices[i], ['#','&'])) = trim(serial) then
begin
Result := True;
break;
end
except end;
end;
end
finally
reg.free;
devices.free;
end;
end; В результате возникли проблемы c 'ExtractWord' пишет Undeclared identifier: 'ExtractWord' Я так понимаю не хватает функции в Uses... Почитал в инете - не понял что к чему....
-
Почитай статью "Работа с устройствами в Windows" http://pblog.ru/?p=105 там есть исходник примера. Долго "причесывать" свой выдранный из проекта код, вкратце - есть куча функций библиотек cfgmgr32.dll и setupapi.dll. И продумай способ, как будешь реализовывать - статически, перебирая все USB-устройства и далее CM_Get_Device_IDA или динамичеки через RegisterDeviceNotification и фильтруя DBT_DEVICEARRIVAL. Кстати, подключение накопителя на уровне системы таким способом не отловить, для этого нужно писать собственный драйвер.
-
function hddser:string;
var
SerialNum : dword;
a, b : dword;
Buffer : array [0..255] of char;
begin
if GetVolumeInformation(pchar('c:\'), Buffer, SizeOf(Buffer), @SerialNum, a, b, nil, 0) then
result := IntToStr(SerialNum);
end;
-
> GetVolumeInformation
Речь про серийный номер ДИСКА (винчестера), а не ТОМА ;-)
|