- Сообщения
- 5,379
- Репутация
- 2,724
Функция генерит уникальный идентификатор компьютера (по железу) с учетом заданных параметров ($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.
Последовательность опроса:
$UHID_MB (0x00)
При генерации ID используется информация о материнской плате. Этот флаг используется по умолчанию независимо от того, задан он или нет.
$UHID_BIOS (0x01)
При генерации ID используется информация из BIOS.
$UHID_CPU (0x02)
При генерации ID используется информация о процессоре(ах). Заметно снижает скорость выполнения функции.
$UHID_HDD (0x04)
При генерации ID используется информация об установленных жестких дисках. Любое изменение в конфигурации дисков приведет к изменению ID, возвращаемого этой функцией. Учитываются только несъемные диски с интерфейсами ATA или SATA.
Самый оптимальный вариант - $UHID_MB + $UHID_BIOS.
Последовательность опроса:
Motherboard (IdentifyingNumber + Name + SKUNumber + UUID + Vendor + Version)
+
BIOS (IdentificationCode + Manufacturer + Name + SerialNumber + SMBIOSMajorVersion + SMBIOSMinorVersion)
+
Processors (CPU1 (Architecture + Family + Level + Manufacturer + Name + ProcessorId + Revision + Version) + CPU2 (...) + ...)
+
HDDs (HDD1 (SerialNumber) + HDD2 (...) + ...)
+
BIOS (IdentificationCode + Manufacturer + Name + SerialNumber + SMBIOSMajorVersion + SMBIOSMinorVersion)
+
Processors (CPU1 (Architecture + Family + Level + Manufacturer + Name + ProcessorId + Revision + Version) + CPU2 (...) + ...)
+
HDDs (HDD1 (SerialNumber) + HDD2 (...) + ...)
Код:
#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