Автор Тема: _UniqueHardwaeIDv1() - Генерация уникального ID компьютера  (Прочитано 37518 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Функция генерит уникальный идентификатор компьютера (по железу) с учетом заданных параметров ($UHID_... флаги).

$UHID_MB (0x00)
При генерации ID используется информация о материнской плате. Этот флаг используется по умолчанию независимо от того, задан он или нет.

$UHID_BIOS (0x01)
При генерации ID используется информация из BIOS.

$UHID_CPU (0x02)
При генерации ID используется информация о процессоре(ах). Заметно снижает скорость выполнения функции.

$UHID_HDD (0x04)
При генерации ID используется информация об установленных жестких дисках. Любое изменение в конфигурации дисков приведет к изменению ID, возвращаемого этой функцией. Учитываются только несъемные диски с интерфейсами ATA или SATA.

Самый оптимальный вариант - $UHID_MB + $UHID_BIOS.

Последовательность опроса:

(нажмите для показа/скрытия)

Код: AutoIt [Выделить]
#Include  <Crypt.au3>
#Include  <WinAPI.au3>

Global Const $UHID_MB = 0x00
Global Const $UHID_BIOS = 0x01
Global Const $UHID_CPU = 0x02
Global Const $UHID_HDD = 0x04

ConsoleWrite(_UniqueHardwaeIDv1() & @CR)
ConsoleWrite(_UniqueHardwaeIDv1(BitOR($UHID_MB, $UHID_BIOS)) & @CR)
;ConsoleWrite(_UniqueHardwaeIDv1(BitOR($UHID_MB, $UHID_BIOS, $UHID_CPU)) & @CR)
;ConsoleWrite(_UniqueHardwaeIDv1(BitOR($UHID_MB, $UHID_BIOS, $UHID_CPU, $UHID_HDD)) & @CR)

Func _UniqueHardwaeIDv1($iFlags = 0)

    Local $oService = ObjGet('winmgmts:\\.\root\cimv2')

    If Not IsObj($oService) Then
        Return SetError(1, 0, '')
    EndIf

    Local $tSPQ, $tSDD, $oItems, $hFile, $Hash, $Ret, $Str, $Hw = '', $Result = 0

    $oItems = $oService.ExecQuery('SELECT * FROM Win32_ComputerSystemProduct')
    If Not IsObj($oItems) Then
        Return SetError(2, 0, '')
    EndIf
    For $Property In $oItems
        $Hw &= $Property.IdentifyingNumber
        $Hw &= $Property.Name
        $Hw &= $Property.SKUNumber
        $Hw &= $Property.UUID
        $Hw &= $Property.Vendor
        $Hw &= $Property.Version
    Next
    $Hw = StringStripWS($Hw, 8)
    If Not $Hw Then
        Return SetError(3, 0, '')
    EndIf
    If BitAND($iFlags, 0x01) Then
        $oItems = $oService.ExecQuery('SELECT * FROM Win32_BIOS')
        If Not IsObj($oItems) Then
            Return SetError(2, 0, '')
        EndIf
        $Str = ''
        For $Property In $oItems
            $Str &= $Property.IdentificationCode
            $Str &= $Property.Manufacturer
            $Str &= $Property.Name
            $Str &= $Property.SerialNumber
            $Str &= $Property.SMBIOSMajorVersion
            $Str &= $Property.SMBIOSMinorVersion
;           $Str &= $Property.Version
        Next
        $Str = StringStripWS($Str, 8)
        If $Str Then
            $Result += 0x01
            $Hw &= $Str
        EndIf
    EndIf
    If BitAND($iFlags, 0x02) Then
        $oItems = $oService.ExecQuery('SELECT * FROM Win32_Processor')
        If Not IsObj($oItems) Then
            Return SetError(2, 0, '')
        EndIf
        $Str = ''
        For $Property In $oItems
            $Str &= $Property.Architecture
            $Str &= $Property.Family
            $Str &= $Property.Level
            $Str &= $Property.Manufacturer
            $Str &= $Property.Name
            $Str &= $Property.ProcessorId
            $Str &= $Property.Revision
            $Str &= $Property.Version
        Next
        $Str = StringStripWS($Str, 8)
        If $Str Then
            $Result += 0x02
            $Hw &= $Str
        EndIf
    EndIf
    If BitAND($iFlags, 0x04) Then
        $oItems = $oService.ExecQuery('SELECT * FROM Win32_PhysicalMedia')
        If Not IsObj($oItems) Then
            Return SetError(2, 0, '')
        EndIf
        $Str = ''
        $tSPQ = DllStructCreate('dword;dword;byte[4]')
        $tSDD = DllStructCreate('ulong;ulong;byte;byte;byte;byte;ulong;ulong;ulong;ulong;dword;ulong;byte[512]')
        For $Property In $oItems
            $hFile = _WinAPI_CreateFile($Property.Tag, 2, 0, 0)
            If Not $hFile Then
                ContinueLoop
            EndIf
            $Ret = DllCall('kernel32.dll', 'int', 'DeviceIoControl', 'ptr', $hFile, 'dword', 0x002D1400, 'ptr', DllStructGetPtr($tSPQ), 'dword', DllStructGetSize($tSPQ), 'ptr', DllStructGetPtr($tSDD), 'dword', DllStructGetSize($tSDD), 'dword*', 0, 'ptr', 0)
            If (Not @error) And ($Ret[0]) And (Not DllStructGetData($tSDD, 5)) Then
                Switch DllStructGetData($tSDD, 11)
                    Case 0x03, 0x0B ; ATA, SATA
                        $Str &= $Property.SerialNumber
                EndSwitch
            EndIf
            _WinAPI_CloseHandle($hFile)
        Next
        $Str = StringStripWS($Str, 8)
        If $Str Then
            $Result += 0x04
            $Hw &= $Str
        EndIf
    EndIf
    $Hash = _Crypt_HashData($Hw, $CALG_MD5)
    If @error Then
        Return SetError(4, 0, '')
    EndIf
    $Hash = StringTrimLeft($Hash, 2)
    Return SetError(0, $Result, '{' & StringMid($Hash, 1, 8) & '-' & StringMid($Hash, 9, 4) & '-' & StringMid($Hash, 13, 4) & '-' & StringMid($Hash, 17, 4) & '-' & StringMid($Hash, 21, 12) & '}')
EndFunc   ;==>_UniqueHardwaeIDv1

« Последнее редактирование: Май 23, 2010, 10:30:47 от Yashied »


Думай, прежде чем говорить.

Русское сообщество AutoIt


Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2314
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: _UniqueHardwaeID() - Получение
« Ответ #1, Отправлен: Май 23, 2010, 01:29:03 »
Yashied
У меня на одном компьютере стоят 2 Win XP. Оба варианта функций показывают одинаковые значения. А на другом стоят Win XP и Win 7. Здесь функция _UniqueHardwaeID() выдает одинаковые варианты, а _UniqueHardwaeID(BitOR($UHID_MB, $UHID_BIOS)) - разные.
Классная функция получилась. Спасибо!

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: _UniqueHardwaeID() - Получение
« Ответ #2, Отправлен: Май 23, 2010, 02:14:03 »
У меня на одном компьютере стоят 2 Win XP. Оба варианта функций показывают одинаковые значения. А на другом стоят Win XP и Win 7. Здесь функция _UniqueHardwaeID() выдает одинаковые варианты, а _UniqueHardwaeID(BitOR($UHID_MB, $UHID_BIOS)) - разные.
Классная функция получилась. Спасибо!

Покажи мне пожалуйста результаты сдедующего примера из XP и 7.

(нажмите для показа/скрытия)

Добавлено:

Хотя ладно, сам разобрался, см. првый пост.
« Последнее редактирование: Май 23, 2010, 02:29:55 от Yashied »

Оффлайн Yuriy [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 737
  • Репутация: 281
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Спасибо. Все работает. Пригодится.
Win XP Pro SP3 чистая (не сборка)
{7FE593D4-5873-4130-49EC-C5C9881319B7}
{06390B63-D3EA-B156-8B85-88CA504DF37B}
>Exit code: 0    Time: 0.516

{7FE593D4-5873-4130-49EC-C5C9881319B7}
{06390B63-D3EA-B156-8B85-88CA504DF37B}
{F47AC66D-7851-F9CD-EBF1-BD329E7F5963}
{C0AF95F0-B58C-611D-32B3-78A145B76813}
>Exit code: 0    Time: 2.556

Русское сообщество AutoIt

Re: _UniqueHardwaeID() - Генерация уникального ID компьютера
« Ответ #3 Отправлен: Май 23, 2010, 02:21:11 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Смысл в том, что на одном и томже компьютере ID должен быть одинаковый, независимо от того, какая OS установлена. Сейчас у меня генерятся ID одинаковые на XP и 7.

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2314
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Yashied  [?]
Цитировать
результаты сдедующего примера из XP и 7.
У меня различается только $Property.Version
WIN_7 & X86       SECCSD - 20080714
WIN_XP & X86     K-Syst - 20080714

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
$Property.Version для "SELECT * FROM Win32_BIOS" ?

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2314
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Yashied
Извините, сразу не написал. Да, для SELECT * FROM Win32_BIOS.

Русское сообщество AutoIt

Re: _UniqueHardwaeID() - Генерация уникального ID компьютера
« Ответ #7 Отправлен: Май 23, 2010, 08:39:07 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
ОК. Я ее уже убрал из кода. Спасибо.



Добавлено: Май 23, 2010, 10:20:44
Переименовал функцию в _UniqueHardwaeIDv1(). Почему? Потому, что любое изменение в этой функции связанное со сбором информации приведет к изменению результирующего ID. В этом случае функция должна уже именоваться как _UniqueHardwaeIDv2() и т.д. (для совместимости).
« Последнее редактирование: Май 23, 2010, 10:31:41 от Yashied, Причина: Объединение сообщений »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Я включил эту функцию в WinAPIEx.au3.

_WinAPI_UniqueHardwareID()
« Последнее редактирование: Октябрь 29, 2010, 11:47:31 от Yashied »

Оффлайн svigelf [?]

  • Новичок
  • *
  • Сообщений: 61
  • Репутация: 17
  • Пол: Мужской
    • Награды
есть вопрос? можно ли какимто образом сменить ID перечисленных устройств? (если можно, то сложно ли ето)

при обновлении Bios  - ID меняется?

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
при обновлении Bios  - ID меняется?

Нет.

Оффлайн svigelf [?]

  • Новичок
  • *
  • Сообщений: 61
  • Репутация: 17
  • Пол: Мужской
    • Награды
 :) это очень хорошо

Оффлайн Luke [?]

  • Новичок
  • *
  • Сообщений: 64
  • Репутация: 14
  • Пол: Мужской
    • Награды
Возникли такие вопросы:
1 На разных виртуальных машинах VMware на одном физическом компе возвращаемый ID будет одинаковый ?
2 На скопированной вирт машине VMware запущеной на другом физическом компе ID будет другой ?
Вообщем можно ли привязать софт к вирт. машине, кто нибудь проверял? (у меня нет такой возможности)

Просьба добавить в параметры UniqueHardwaeID() MAC адрес сетевой карты.

Оффлайн Belfigor [?]

  • Локальный модератор
  • *
  • Сообщений: 3482
  • Репутация: 926
    • Награды
  • Версия AutoIt: 3.3.14.0
Люк, решил таки свой софт продавать?

Любые темы внутри раздела "Разработка ботов" не названные в соответствии с правилами раздела, будут закрываться.
Любой ответ, любого пользователя в теме с предупреждением, направленный на решение вопроса, произведенный до того как предупреждение было исправлено, приведет к закрытию темы и удалению всего что было после предупреждения.

Русское сообщество AutoIt

Re: _UniqueHardwaeIDv1() - Генерация уникального ID компьютера
« Ответ #14 Отправлен: Март 03, 2011, 12:02:42 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
5 Ответов
5265 Просмотров
Последний ответ Июль 04, 2011, 13:42:27
от Kaster
5 Ответов
5027 Просмотров
Последний ответ Сентябрь 22, 2013, 20:39:08
от blacklis
9 Ответов
4807 Просмотров
Последний ответ Июнь 18, 2012, 22:10:55
от Isn
0 Ответов
947 Просмотров
Последний ответ Январь 03, 2015, 23:03:42
от damien2008
2 Ответов
942 Просмотров
Последний ответ Июль 28, 2015, 16:08:24
от Yashied
5 Ответов
1066 Просмотров
Последний ответ Декабрь 22, 2015, 19:01:03
от InnI
5 Ответов
1067 Просмотров
Последний ответ Апрель 08, 2016, 08:15:44
от Belfigor
15 Ответов
1908 Просмотров
Последний ответ Май 05, 2016, 13:22:58
от Alofa
2 Ответов
599 Просмотров
Последний ответ Июль 13, 2016, 13:52:36
от Dessan
4 Ответов
449 Просмотров
Последний ответ Июль 10, 2017, 11:21:22
от perven1