Что нового

Генерация уникального кода компьютера.

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Всем привет.
Мне нужно генерировать уникальный код компьютера, желательно чтоб бралось не одного устройства(серийные номера и.т.д...), а несколько!
Чтобы код был уникальным, и чтобы уникальный код не куда не писался, просто при включении программы с генерировался заново; Но чтоб с генерировался в тот-же самый.
Т.е Если включить программу на одном и том же компе, то она должна показывать одинаковый уникальный код, а вот если на разных компах, то разный!

У меня есть примерный, но он врядли уникален.
Код:
Func _DriveCod()
	Local $Drive = DriveGetDrive('FIXED')
	if Not IsArray($Drive) Then
		Exit
	EndIf
	Return DriveGetSerial($Drive[$Drive[0]]&'\') * 1024
EndFunc
 

beliy

Продвинутый
Сообщения
372
Репутация
72
посмотрите в сторону _WinAPI_UniqueHardwareID - http://autoit-script.ru/index.php?topic=2474.0
 
Автор
Ganibal95

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Сделал такое:
Код:
Func _GAPIEx_GetUnicalCod()
	Local $Drive
	Local $iDrive = DriveGetDrive('FIXED')
    If (Not IsArray($iDrive)) Then
        $Drive = 1024
    EndIf
	For $i = 1 To $iDrive[0]
		$Drive += Round((DriveGetSerial($iDrive[$i]) * 2.45) + (DriveGetSerial($iDrive[$i]) / 2))
	Next
	$Drive *= 1024
	Local $BIOS = Number(_WinAPI_UniqueHardwareID(BitOR($UHID_MB, $UHID_BIOS)))
	Local $sProductID = Number(RegRead('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion', 'ProductId'))
	Return Round(((Mod($Drive,100) + $Drive) / 1024) + Mod($sProductID&$BIOS&$Drive,100) + $BIOS&$sProductID&$BIOS)&Round(Mod($BIOS,50)&$BIOS&($sProductID / 2))
EndFunc

если кто-то хочет помочь модернизировать то пишите.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Все, что тебе нужно, это _WinAPI_UniqueHardwareID(). Остальные функции не дают "железный" результат. Например, DriveGetSerial() слетит после форматирования диска или ручного его изменения.
 
Автор
Ganibal95

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Yashied
А как можно узнать например серийник процессора, Матиринской платы и.т.д...?)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Функция _WinAPI_UniqueHardwareID() генерирует GUID по четырем составляющим (см. описание).
 
Автор
Ganibal95

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Yashied
Мне нужно в цифровом виде.
Т.е чтоб циферки выводил. :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Тогда смотри как устроена эта функция.
 

Isn

Новичок
Сообщения
119
Репутация
3
Вот еще примерчик, где то на форуме есть, по моему Yashied его писал
Код:
ConsoleWrite(_UniqueHardwaeID2(BitOR($UHID_MB, $UHID_BIOS)) & @CR)
Func _UniqueHardwaeID2($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
		ConsoleWrite($Property.IdentifyingNumber & @CR)
		ConsoleWrite($Property.Name & @CR)
		ConsoleWrite($Property.SKUNumber & @CR)
		ConsoleWrite($Property.UUID & @CR)
		ConsoleWrite($Property.Vendor & @CR)
		ConsoleWrite($Property.Version & @CR)
		ConsoleWrite('--------------------' & @CR)
        $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
			ConsoleWrite($Property.IdentificationCode & @CR)
			ConsoleWrite($Property.Manufacturer & @CR)
			ConsoleWrite($Property.Name & @CR)
			ConsoleWrite($Property.SerialNumber & @CR)
			ConsoleWrite($Property.SMBIOSMajorVersion & @CR)
			ConsoleWrite($Property.SMBIOSMinorVersion & @CR)
			ConsoleWrite($Property.Version & @CR)
			ConsoleWrite('--------------------' & @CR)
            $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)
;---------------------------------------------------------------------------------------------------------------------------------------------------
;Проверка ID компьютера на сервере
	$sServerUP = "http:///ID/" & $Hash & ".bin"
	$sID = _INetGetSource($sServerUP)
	If $sID = $Hash Then
		Sleep(100)
		 _GUICtrlStatusBar_SetText($StatusBar1, " uPdater Активирован")
	Else
		_GUI_DISABLE()
	EndIf
 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

Я использовал для привязки генерирование ID и сверокй ID на сервере.
 
Верх