Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.01.08;
Скачать: CL | DM;

Вниз

серийный номер диска   Найти похожие ветки 

 
defen ©   (2009-09-15 07:31) [0]

Доброго времени суток. Помогите пожалуйста, необходимо программно получить серийный номер носителя (VolumeSerialNumber) не подходит. Нужен тот, который зашили производители. Сам не нашел. Может кто что-нибудь полезное подскажет?


 
MBo ©   (2009-09-15 08:41) [1]

http://home.earthlink.net/~akonshin/delphi_ru.htm


 
defen ©   (2009-09-16 08:04) [2]

Спасибо, но меня по большей части интересует USB подключение...


 
Дмитрий   (2009-09-16 09:34) [3]

Чего подключаем ? Если USB Flash, то код экземпляра устройства (например USBSTOR\DISK&VEN_KINGSTON&PROD_DATATRAVELER_2.0&REV_1.00\81100000000000000000001 E&0
) содержит в себе серийный номер (81100000000000000000001E). Только советую сначала проверить, отличается ли серийный номер разных флешек из одной партии. А то китайцы - народ своеобразный...


 
GanibalLector ©   (2009-09-16 21:52) [4]


2 MBo ©   (15.09.09 08:41) [1]
> http://home.earthlink.net/~akonshin/delphi_ru.htm


Кстати, он в Viste не работает. Судя по всему и в Win7 тоже


 
defen ©   (2009-09-17 02:06) [5]

В общем программа должна блокировать 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... Почитал в инете - не понял что к чему....


 
Дмитрий   (2009-09-17 10:12) [6]

Почитай статью "Работа с устройствами в Windows" http://pblog.ru/?p=105 там есть исходник примера. Долго "причесывать" свой выдранный из проекта код, вкратце - есть куча функций библиотек cfgmgr32.dll и setupapi.dll. И продумай способ, как будешь реализовывать - статически, перебирая все USB-устройства и далее CM_Get_Device_IDA или динамичеки через RegisterDeviceNotification и фильтруя DBT_DEVICEARRIVAL. Кстати, подключение накопителя на уровне системы таким способом не отловить, для этого нужно писать собственный драйвер.


 
trix   (2009-09-23 18:27) [7]

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;


 
TIF ©   (2009-09-23 22:37) [8]

> GetVolumeInformation

Речь про серийный номер ДИСКА (винчестера), а не ТОМА ;-)



Страницы: 1 вся ветка

Текущий архив: 2012.01.08;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
15-1316204983
Юрий
2011-09-17 00:29
2012.01.08
С днем рождения ! 17 сентября 2011 суббота


15-1316550580
Юрий
2011-09-21 00:29
2012.01.08
С днем рождения ! 21 сентября 2011 среда


15-1316509651
Dennis I. Komarov
2011-09-20 13:07
2012.01.08
SATA - SATA-II


15-1312890604
БарЛог
2011-08-09 15:50
2012.01.08
Задача: стальной шар радиусом R падает в воду


2-1317379208
suize
2011-09-30 14:40
2012.01.08
шрифты в delphiXe2