[Delphi] Серийные номера устройств.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Tip.the.besT, 21 Sep 2011.

  1. Tip.the.besT

    Tip.the.besT Member

    Joined:
    24 Jun 2009
    Messages:
    267
    Likes Received:
    10
    Reputations:
    4
    Доброго времени суток.

    Вообщем столкнулся с необходимостью определять физические серийные номера устройств, таких как: винчестер, сетевая плата(если не встроеная), процессор, CD/DVD-привод, материнка, память, видеокарта(опять же если не встроеная). О винчестерах много написано, но как быть с остальными устройствами? Линки по материалам приветствуются.
    был бы один системник я бы и так нашёл, но их много :rolleyes:
     
  2. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Можешь посмотреь через WMI (как им пользоваться на делфе ищи в гугле).
    Вот тебе далеко не полная подборочка имен
    да и сам полазь стандарными утилитами, может что для себя полезное найдешь
     
    _________________________
  3. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    советую посмотреть исходники проги под названием aspia. Это Опер сорс прога котоаря показывала инфу о системе. тока там дров юзается(для некоторых специфических данных) и на Си написана
     
  4. Tip.the.besT

    Tip.the.besT Member

    Joined:
    24 Jun 2009
    Messages:
    267
    Likes Received:
    10
    Reputations:
    4
    А это мне случаем не выдаст ID устройства в системе за место физического серийного номера?
     
  5. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    тут надо много уточнений,например серийник интелового проца и амдшного по-разному буду определяться,могу сказать следующее:
    1)Серийник винта умеют определять некоторые компоненты,поищи в нете
    2)серийник сетевухи-(если ошибаюсь-поправьте)ты говоришь о мак адресе?узнать можешь даже через ipconfig
    3)для процессора на delphi даже не знаю как,на асме встроенном разве что,ну могу на чистом асме навоять если надо.
    4)какой памяти,озу в смысле?
    5)номер материнки можно взять из биоса,иногда данные есть в реестре
    6)для видюхи это по-моему невозможно вообще,по крайней мере я еще такого не встречал.
    Все еще зависит от оси.так что не все так просто.
     
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    серийник винта/флешки можно определить через IOCTL запрос к драйверу.
    А именно: IOCTL_STORAGE_QUERY_PROPERTY

    большинство IDE это поддерживают. Через этот запрос удобно узнать название винта. Зависит всё от структуры. Всё в MSDN хорошо описано
     
    #6 slesh, 21 Sep 2011
    Last edited: 21 Sep 2011
  7. gavriil

    gavriil New Member

    Joined:
    18 Aug 2011
    Messages:
    11
    Likes Received:
    3
    Reputations:
    0
    Компонент: MiTeC System Information
    Добавляет правда под мб весу, но можно как плагин подключить в библиотеке.

    Выдает вообще все что можно о системе. Вместе с исходниками можно найти на варезных сайтах.

    Если хочешь без доп весу то только через WMI
     
  8. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    вот почитал доку,навоял те для проца
    Code:
    ;This program was created in assembler editor
    .486
    .model flat, stdcall
    option casemap:none
    
    include include\windows.inc
    include include\kernel32.inc
    include include\user32.inc
    
    includelib lib\kernel32.lib
    includelib lib\user32.lib
    
    .const
    viv db "%04X-%04X-%04X-%04X-%04X-%04X", 0
    
    .data?
    buffer db 128 dup(?)
    
    .code
    start:
    
    pushad
    
    mov eax, 1
    cpuid
    
    push eax
    
    mov eax, 3
    cpuid
    
    pop eax
    
    invoke wsprintf, addr buffer, addr viv,ebx,eax,edx,ecx
    invoke MessageBox, 0, addr buffer, 0, MB_OK
    
    popad
    
    invoke ExitProcess, 0
    
    end start 
    
    теперь что к чему и как работает:
    при cpuid eax=3 в регистры edx,ecx возвращается 8 байт номера, вместе с теми 4 что возвращаются в eax при cpuid eax=1.В следствии этого мы получаем уникальный идентификатор процессора, то-бишь с.н.
    Конечно весь этот бадыль будет работать не старше чем на 3-м пеньке и если фича включена в биосе(а по дефолту она вырублена)
     
    #8 DooD, 22 Sep 2011
    Last edited: 22 Sep 2011
    1 person likes this.
  9. Tip.the.besT

    Tip.the.besT Member

    Joined:
    24 Jun 2009
    Messages:
    267
    Likes Received:
    10
    Reputations:
    4
    Спасибо большое за старания, но в асме я дуб дубом :D Вот если бы кто реализовал на delphi...

    Кому интересно вот линк на win32 classes.

    Там тоже надо разбиратся конечно, но повторюсь ещё раз, он точно мне серийный номер физический даст или всё - таки номер в системе?
     
  10. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    Еще раз повторюсь, как бы ты не определял,на каком бы языке не делал(для процессора)выше чем пентиум 3 серийники НЕ ПОКАЗЫВАЮТСЯ!!!
     
  11. Tip.the.besT

    Tip.the.besT Member

    Joined:
    24 Jun 2009
    Messages:
    267
    Likes Received:
    10
    Reputations:
    4
    Да понил я тебя, что ты кричиш, не в том вопрос с какого пентиума, то, что с третьего я понил, я спрашиваю серийник выдаст в системе или физический? :mad:
     
  12. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    физический выдаст только если юзать низший уровень, то-бишь ассемблер.Компоненты скорее всего ничего не выдадут.