Что нового

Привязка к компьютеру

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Garrett
На моем ноутбуке никаких изменений: как не работало, так и не работает. Но, я скрипт скомпилировал и "пошел по компам".
Результат:
1. На 4-х ядерном стационарном почти новом К-системс показывает все, только вместо $oMB.SerialNumber - восемь нулей и на WIN XP, и на WIN 7.
2. На годовалом ноутбуке Acer показывает все три строки нормально.
3. На стареньком, 10 раз пересобранном стационаре (уже давно неизвестной модели), показывает все три строки нормально.

Вывод для себя делаю такой: это не надежный способ, увы... :(
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Привожу цитату из справки, возможно в этом дело
Справка сказал(а):
Keep in mind that not all computers have the same set of Objects. So always check for errors after calling ObjGet()
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
madmasles
У меня:
PC1 Asus P4P800 SE 3Ghz WinXP SP2
PC2 Asus P5K 3Ghz WinXP SP2
Noutbook Dell INSPIRON 1200 PP10S

Везде нормально работает :(



Добавлено:
Сообщение автоматически объединено:

Kaster сказал(а):
Привожу цитату из справки, возможно в этом дело
Справка сказал(а):
Keep in mind that not all computers have the same set of Objects. So always check for errors after calling ObjGet()
Да, я это тоже читал, но madmasles говорил, что с ObjGet() ошибок не возвращает :(
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Kaster
Garrett
У меня с ObjGet() все нормально, у меня дальше не нормально. :shok:


Garrett
Везде нормально работает
Все равно считаю этот способ не надежным, раз он не везде работает.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
madmasles
Какая у вас версия Framework?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Garrett
У меня на всех компах, где проверял, стоит NET.Framework 3.5 SP1.
 

vcomp71

Осваивающий
Сообщения
431
Репутация
25
У меня работает... А серийник не выдает... :(
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
После очередных экспериментов пришел к выводу, что не все производители заботятся о таких мелочах как (зашитый) серийный номер МВ!
В продолжение темы выкладываю код, который вытаскивает производителя и серийный номер из BIOS, а следом читает с МВ. По идеи он должен совпадать с серийным номером МВ (хотя бы часть)
Пожалуйста, проверьте, у кого определялись и не определялись параметры МВ предыдущим кодом.

Код:
Dim $WbemFlagReturnImmediately = 0x10
Dim $WbemFlagForwardOnly = 0x20

$oService  = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")

If IsObj($oService) Then 
	_BIOS($oService)
	_MB($oService)
Else
	MsgBox(0,"Error:","This is not Object!")
EndIf

Func _BIOS($oService)
    For $oBIOS In $oService.ExecQuery("SELECT * FROM Win32_BIOS","WQL", BitOR($WbemFlagReturnImmediately, $WbemFlagForwardOnly))
        MsgBox(0,"BIOS Information","Manufacturer.: " & $oBIOS.Manufacturer & @CRLF& _
        "Serial Number.: " & $oBIOS.SerialNumber & @CRLF)
    Next
EndFunc

Func _MB($oService)
    For $oMB In $oService.ExecQuery("SELECT * FROM Win32_BaseBoard","WQL", BitOR($WbemFlagReturnImmediately, $WbemFlagForwardOnly))
        MsgBox(0,"MB Information","Manufacturer.: " & $oMB.Manufacturer & @CRLF& _
        "Serial Number.: " & $oMB.SerialNumber & @CRLF)
    Next
EndFunc


P.S. Вот информация с моего ноутбука:
[box title=BIOS Information]Manufacturer.: Dell Inc.
Serial Number.: 2CW7M1J[/box]
[box title=MB Information]Manufacturer.: Dell Inc.
Serial Number.: .2CW7M1J.CN4864353Q3649.[/box]
 

vcomp71

Осваивающий
Сообщения
431
Репутация
25
У меня не определяет... По моему все-таки все дело в программном обеспечении и его совместимости с железом.
 

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
Уж лучше бы код без всяких объектов. Они очень долго выполняются и не на всех системах срабатывают как надо.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Garrett
У меня показывает следующее:
Win XP[box title=1-BIOS Information]
Manufacturer.: SAMSUNG ELECTRONICS CO.,LTD
Serial Number.: 123490EN400015[/box]И Win XP, и Win 7[box title=2-BIOS Information]
Manufacturer.: American Megatrends Inc.
Serial Number.: 698739[/box][box title=2-MB Information]
Manufacturer.: ECS
Serial Number.: 00000000[/box]Win XP[box title=3-BIOS Information]
Manufacturer.: Acer
Serial Number.: LXAL80X0898070BE192513[/box][box title=3-MB Information]
Manufacturer.: Acer
Serial Number.: LXAL80X0898070BE192513[/box]Четвертый комп сейчас "вне зоны доступа". :smile:
Вывод - BIOS Information значительно надежнее, но, у Vlasssov`a вроде не показывает... значит тоже не самый оптимальный вариант.
И у Kaster`a MB работает, а BIOS не до конца. :(
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
[box title=BIOS]
Manufacturer.: Dell Inc.
Serial Number.: H12GJ2J
[/box]
[box title=MB]
Manufacturer.: Dell Inc.
Serial Number.: .H12GJ2J.CN129616A6C27E.
[/box]
 

vcomp71

Осваивающий
Сообщения
431
Репутация
25
Manufacturer.: Award Software International, Inc.
Serial Number.:
MB Information
Manufacturer.: Gigabyte Technology Co., Ltd.
Serial Number.:

Windows xp sp3
core2duo
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
В Microsoft Windows Driver Kits 7.1.0 есть прикольная утилита (в аттаче), которая работает из командной строки и генерит GUID для компьютера по заданным критериям, например:

Manufacturer + Family + ProductName + BIOS Vendor + BIOS Version + BIOS Major Release + BIOS Minor Release + и т.д.



Добавлено:
Сообщение автоматически объединено:

Что-то типа этого:

Код:
#Include <Constants.au3>

$GUID = ''

$Pid = Run(@ScriptDir & '\ComputerHardwareIds.exe', '', @SW_HIDE, $STDOUT_CHILD)
While 1
	$Line = StdoutRead($Pid)
	If @error Then
		ExitLoop
	EndIf
	$GUID = StringUpper(StringMid($Line, StringInStr($Line, '{'), 39))
	If $GUID Then
		ExitLoop
	EndIf
WEnd

If $GUID Then
	ConsoleWrite($GUID & @CR)
EndIf
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Упс... Даже не для Vista, а для 7.

:whistle:

Ну, через лет семь будет актуальна.

:smile:


Добавлено:
Сообщение автоматически объединено:

Код:
$objWMIService = ObjGet('winmgmts:\\.\root\cimv2')
$colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_ComputerSystemProduct')
If IsObj($colItems) Then
	For $objItem In $colItems
		ConsoleWrite($objItem.UUID & @CR)
	Next
EndIf
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Yashied
На msdn пишут про UUID
If a UUID is not available, a UUID of all zeros is used.
Как я понял: если UUID недоступен, то заполняется нулями. Значит тоже не 100%. :(
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Вообщем смысл таков. Получаем разную информацию из BIOS (дата, серийник, производитель и т.д.), объединяем в одну строку и генерим MD5 для нее. Затем можно из этого составить GUID в виде {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}. У Kaster'а есть UDF для получения разных хешей, может быть он напишит независимую (без использования его UDF) функцию типа _GetUniqueHardwareID(...)?
 

FlatX007

Tattoo!
Сообщения
197
Репутация
35
Кодируем :
Код:
#cs ----------------------------------------------------------------------------
 Скрипт запускается интсалятором из папки с программой с ключём [-07506445cd06b6472fe4350d], потом удаляется!
 Шифрует информацию из реестра [HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System] c рандомным ключём
 по методу RC4 вложеность(2) и записыватет шифрованный текст в файл
 Создаёт лог в папке ТЕМР - [...\Temp\log.txt]
 Скрипт используется один раз!
#ce ----------------------------------------------------------------------------

#include <String.au3>
#Include <Process.au3>
#Include <Date.au3>

Global Const $PARAMETER_DECODER = 1.4648645654
Global Const $REESTR_PATH = "HKEY_CURRENT_USER\Software\MuProrgamm\"
Global Const $PATH_PROTECT_DAT = @ScriptDir & '\' & 'PROTECT.dat'
Global Const $LOG_FILE = @TempDir & "\log.txt"

If @Compiled = 1 Then
	If $CmdLineRaw <> "-07506445cd06b6472fe4350d" Then Exit
EndIf

; Считываем разделы реестра
$Key1 = RegRead("HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\BIOS", "BaseBoardManufacturer")
$Key2 = RegRead("HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\BIOS", "BaseBoardProduct")
$Key3 = RegRead("HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\BIOS", "BIOSVendor")
$Key4 = RegRead("HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0", "ProcessorNameString")
$Key_Total = $Key1 & $Key2 & $Key3 & $Key4

; Возвращаем рандомный ключ
$iRandom = Round(Random(100,1000000))
; Записываем рандомный ключ в реестр
$RegWriteKeyRandom = RegWrite($REESTR_PATH, "Key", "REG_SZ", $iRandom)
; Делим на параметр
$Total = $iRandom / $PARAMETER_DECODER
; Переводим число в НЕХ
$KeyHex_Kode =  _StringToHex($Total) ; Ключ для кодирования
; Кодируем данные из реестра
$Code_Key = _StringEncrypt(1, $Key_Total, $KeyHex_Kode, 2)
; Записываем кодированнаю информацию из реестра.
FileDelete($PATH_PROTECT_DAT)
FileWrite($PATH_PROTECT_DAT, $Code_Key)

FileWrite($LOG_FILE, @CRLF & " --------------------------------" & _NowCalc() & "-------------------------------" & @CRLF)
If $RegWriteKeyRandom = 0 Then FileWrite($LOG_FILE, _NowCalc() & " - Ошибка записи ключа в реестр" & @CRLF)
If $RegWriteKeyRandom = 1 Then FileWrite($LOG_FILE, _NowCalc() & " - Ключ записан в реестр" & @CRLF)

Проверяем ключ:
Код:
#include <String.au3>

Global Const $PARAMETER_DECODER = 1.4648645654
Global Const $REESTR_PATH = "HKEY_CURRENT_USER\Software\MuProrgamm\"
Global Const $PATH_PROTECT_DAT = @ScriptDir & '\' & 'PROTECT.dat'

If _CheckingEncodedKey() = 0 Then MsgBox(0, "", "Не верный ключ!")
If _CheckingEncodedKey() = 1 Then MsgBox(0, "", "Верный ключ")

Func _CheckingEncodedKey()

	Local $sKey1, $sKey2, $sKey3, $sKey4, $sKey_Total, $sDecode_Key, $sDecodePasword

   ; Проверяем шифрованный файл. Считываем разделы реестра ...
	$sKey1 = RegRead("HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\BIOS", "BaseBoardManufacturer")
	$sKey2 = RegRead("HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\BIOS", "BaseBoardProduct")
	$sKey3 = RegRead("HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\BIOS", "BIOSVendor")
	$sKey4 = RegRead("HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0", "ProcessorNameString")
	$sKey_Total = $sKey1 & $sKey2 & $sKey3 & $sKey4
	; Кодируем в НЕХ ключ из реестра и делим на число - Получаем ключ
	$sDecode_Key = _StringToHex(RegRead($REESTR_PATH, "Key") / $PARAMETER_DECODER)
	; Дешифруем текст из INI
	$sDecodePasword = _StringEncrypt(0, FileRead($PATH_PROTECT_DAT) ,$sDecode_Key, 2)
	; Сравниваем реальную информацию из реестра с информацией из Ini
	If $sKey_Total <> $sDecodePasword Or Not FileExists($PATH_PROTECT_DAT) Or FileRead($PATH_PROTECT_DAT) = ""  Then Return 0

	Return 1

EndFunc   ;==>_CheckingEncodedKey
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
FlatX007
У меня нет раздела HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\BIOS, а все данные биоса уровнем выше. Поиск по реестру BIOSVendor ничего не дал. У меня получится идентификация только по процессору. Добавить больше параметров для идентификации и если error, то "некую последовательность цифр" в переменную $key.

Garrett
первый скрипт выдал данные, второй также как у Vlasssov.
 
Верх