Конференция "WinAPI" » серийный номер диска
 
  • defen © (15.09.09 07:31) [0]
    Доброго времени суток. Помогите пожалуйста, необходимо программно получить серийный номер носителя (VolumeSerialNumber) не подходит. Нужен тот, который зашили производители. Сам не нашел. Может кто что-нибудь полезное подскажет?
  • MBo © (15.09.09 08:41) [1]
  • defen © (16.09.09 08:04) [2]
    Спасибо, но меня по большей части интересует USB подключение...
  • Дмитрий (16.09.09 09:34) [3]
    Чего подключаем ? Если USB Flash, то код экземпляра устройства (например USBSTOR\DISK&VEN_KINGSTON&PROD_DATATRAVELER_2.0&REV_1.00\81100000000000000000001 E&0
    ) содержит в себе серийный номер (81100000000000000000001E). Только советую сначала проверить, отличается ли серийный номер разных флешек из одной партии. А то китайцы - народ своеобразный...
  • GanibalLector © (16.09.09 21:52) [4]

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


    Кстати, он в Viste не работает. Судя по всему и в Win7 тоже
  • defen © (17.09.09 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... Почитал в инете - не понял что к чему....

  • Дмитрий (17.09.09 10:12) [6]
    Почитай статью "Работа с устройствами в Windows" http://pblog.ru/?p=105 там есть исходник примера. Долго "причесывать" свой выдранный из проекта код, вкратце - есть куча функций библиотек cfgmgr32.dll и setupapi.dll. И продумай способ, как будешь реализовывать - статически, перебирая все USB-устройства и далее CM_Get_Device_IDA или динамичеки через RegisterDeviceNotification и фильтруя DBT_DEVICEARRIVAL. Кстати, подключение накопителя на уровне системы таким способом не отловить, для этого нужно писать собственный драйвер.
  • trix (23.09.09 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 © (23.09.09 22:37) [8]
    > GetVolumeInformation

    Речь про серийный номер ДИСКА (винчестера), а не ТОМА ;-)
 
Конференция "WinAPI" » серийный номер диска
Есть новые Нет новых   [134433   +24][b:0][p:0.003]