Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

серийный номер диска


defen ©   (2009-09-15 07:31:00) 

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


TIF   (2009-09-23 22:37:00) [1]

> Get VolumeInformation

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


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

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;


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

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


defen   (2009-09-17 02:06:00) [4]

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


GanibalLector   (2009-09-16 21:52:00) [5]


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


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


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

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


defen   (2009-09-16 08:04:00) [7]

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


MBo   (2009-09-15 08:41:00) [8]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо