Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flash Приложения: AIR, Zinc и тд. (http://www.flasher.ru/forum/forumdisplay.php?f=94)
-   -   Узнать ID компьютера (http://www.flasher.ru/forum/showthread.php?t=142587)

Psycho Tiger 25.07.2010 17:44

Узнать ID компьютера
 
По долгу службы требуется узнать уникальный код компьютера, например md5(серийник_матери). Нужно для "регистрации" - то есть чтобы войти в приложение можно было по ключу, уникальному для каждого компьютера.

Встаёт вопрос, как это сделать и какую оболочку выбрать. Знающие люди говорят, что зинк - кривой и бажный, что то сделать без костылей на нём не получится и говорят смотреть в сторону air`а, однако проблема в том что запускаться ехешник (разработка только под вин) должен одним кликом, а установка эира и приложения сразу запрещена лицензией. Встаёт вопрос, как бы это делали Вы?

Про то, что любая защита ломается я знаю. Выбор остался на флеше потому что из фич, недоступных флешу мне нужно только это.

Добавлено через 2 часа 2 минуты
По сути, самыми вменяемыми способами которые я смог нагуглить - это выборка из реестра, только не совсем понятно, откуда же.
HKEY_LOCAL_MACHINE/HARDWARE/DESCRIPTION/SYSTEM говорит гугл, однако там нету серийников. Разве что Configuration data, только я в этом сомневаюсь.

Другой способ - это WMI, вроде zinc поддерживает работу с ним. Будем пытаться, буду рад информации по теме.

Добавлено через 4 часа 55 минут
Выбор пал на расширение проектора от alexcon`а, однако нечто то что нужно мне у него не реализовано, разве что PSystem.getComputerInfo(), но это не совсем то.

Цитата:

name=>MICROSOF-CA89DF
platformId=>500
lanRoot=>
loggedUsers=>2
lanGroup=>WORKGROUP
Буду биться дальше, подумываю над вызовом VBScript.

Добавлено через 7 часов 28 минут
Да, получилось! Вызов WMI из VBScript, работает как надо.
script.txt
Код:

Option Explicit
Function getSerial()
Dim objWMIService, objItem, colItems
Set objWMIService = GetObject("winmgmts:\\" & "." & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_BaseBoard")
For Each objItem in colItems
getSerial=objItem.SerialNumber
Next
End Function

Возвращаем первый из тех, что берём перебором. Пахнет быдлокодом, но VBScript я не знаю и это работоспособно. Это уже хорошо.

Код AS3:

PScript.initEngine();
if (!PScript.addScriptFromFile("script.txt")) PDialogs.msgBox(PScript.getScriptError());
var res:String = PScript.call("getSerial");
someTextField.text=res;
PScript.terminateEngine();

При закрытии всё равно всплывает ошибка:
Цитата:

Инструкция по адресу "0x10020a15" обратилась к памяти по адресу "0x58761460". Память не может быть "read".
Заодно заметил, что если не сделать initEngine перед тем, как добавлять скрипт - это крашит флешплеер)

alexcon314 26.07.2010 12:17

Psycho Tiger, спасибо за информацию.
Баги поправил.
По теме:
WMI, да, рулит. Но, на моем компе скрипт не выводит серийник мамки, выводит пустоту. Так что закладываться на этот серийник не стоит. Почему так - видимо, модель мамки старовата или еще что-то. Вот objItem.Product выводит, но это типа модель.
Наверно, будет правильней сгенерить свой уникальный ид на основе информации о нескольких девайсах, получить которую можно с помощью того же WMI, и записать этот ид в реестр или еще куда-то. Потом сверять.

Еще можно как основу уникального ид взять какой-то системный GUID(это практически уникальная штука) из реестра, например
HKCU\Identities\Default Udser ID или еще чего-нибудь..

Еще PScript.call("getSerial()");(скобки рекомендуется писать)
Есть так же PFileSystem.getDiskInfo("c:");
возвратит объект, поле serial которого содержит серийник диска.
И да, инфу о железе просто и безболезненно вынимать только через WMI. Есть и другие способы, но реализовать их на все случаи жизни я не счел нужным. Впрочем, если есть конкретный пожелания - озвучьте, рассмотрим и если гуд - внесем.

UPD
Добавил метод PRegistry.enumKey() для перечисления ключей в ветке

Psycho Tiger 26.07.2010 12:38

Отлично, спасибо за фиксы. Можно на "ты" перейдём? Не первый и не второй год на флешере общаемся.
Идея получить серийник материнки мне кажется наиболее правильной, т.к. это почти единственная неизменяемая часть компьютера, но видимо придется отказаться в сторону диска.
По сути, инфу о железе вынимать периодически нужно, наверное, было бы здорово увидеть какой-нибудь интерфейс для WMI. Проще говоря, метод, который принимает строку SQL запрос. В итоге один метод для всего чего только можно.

Добавлено через 12 минут
Кстати, а PFileSystem.getDiskInfo("c:") содержит именно серийный номер диска, или серийный номер тома? Второе в моём случае совсем непригодно...
У меня диск один, разбитый на 2 логических диска. Серийники для них разные, похоже, это правда серийник тома...

alexcon314 26.07.2010 14:08

Насчет интерфейса для запросов WMI, ну что ж.. вобщем-то можно свой AS-класс-обертку написать, который юзает (или расширяет) PScript, формируя по какоЙ-то схеме стандартизованный запрос и вставляет его в шаблон скрипта)).
WMI - необъятная штука, сделать что-то лучше, чем имеющийся скриптовый интерфейс не представляется возможным.
Вот кстати неплохая реализация на C#
http://www.codeproject.com/KB/system...formation.aspx

Собственно, я изначально старался уйти от "оберток", предоставляя доступ к АПИ системы на возможно низком уровне. Надо что-то свое - расширяйтесь.

Примеры http://www.script-coding.info/WMI_HardWare.html

Но идея с GUID мне кажется не менее плодотворной. GUID'ы назначаются при установке винды (или каких-то последующих глобальных пертурбациях, типа установки девайса, создания пользователей и т.п.). Так что уникальность тут тоже хорошая.

И да, на ты, конечно.

Добавлено через 3 часа 3 минуты
Что-то зацепило меня..
вот еще фришная тулза
http://www.winsim.com/diskid32/diskid32.html

юзать примерно так: var str:String = PSystem.execStdOut("diskid32.exe");
и распарсить строку. Строка получается такого вида:
Цитата:

To get all details use "diskid32 /d"

Trying to read the drive IDs using physical access with admin rights

Drive 0 - Primary Controller - - Master drive

Drive Model Number________________: [ST3200422AS]
Drive Serial Number_______________: [ 3LJ2PGE1]
Drive Controller Revision Number__: [3.01]
Controller Buffer Size on Drive___: 8388608 bytes
Drive Type________________________: Fixed
Drive Size________________________: 200048565760 bytes

Trying to read the drive IDs using the SCSI back door

Drive 2 - Secondary Controller - - Master drive

Drive Model Number________________: [ST3200422AS]
Drive Serial Number_______________: [ 3LJ2PGE1]
Drive Controller Revision Number__: [3.01]
Controller Buffer Size on Drive___: 8388608 bytes
Drive Type________________________: Fixed
Drive Size________________________: 200048565760 bytes

Trying to read the drive IDs using physical access with zero rights

**** STORAGE_DEVICE_DESCRIPTOR for drive 0 ****
Vendor Id = []
Product Id = [ST3200422AS]
Product Revision = [3.01]
Serial Number = []

**** DISK_GEOMETRY_EX for drive 0 ****
Disk is fixed
DiskSize = 200048565760

Trying to read the drive IDs using Smart

Drive 0 - Primary Controller - - Master drive

Drive Model Number________________: [ST3200422AS]
Drive Serial Number_______________: [ 3LJ2PGE1]
Drive Controller Revision Number__: [3.01]
Controller Buffer Size on Drive___: 8388638 bytes
Drive Type________________________: Fixed
Drive Size________________________: 200048565760 bytes

Hard Drive Serial Number__________: 3LJ2PGE1

Hard Drive Model Number___________: ST3200422AS

Computer ID_______________________: 652946811

MAC Address: 00-17-9A-C3-91-C2

1
1
не хочется расширение .ехе - переименуй в .dll, var str:String = PSystem.execStdOut("diskid32.dll"); тоже будет работать.
Кстати и сорцы это штуки есть на сайте, можешь скомпилить под себя и юзать чисто то, что тебе нужно без лишнего мусора.
Насколько я понял
Цитата:

Computer ID_______________________: 652946811
это действительно ид компа. В сорсах значение этой переменной хитро сформировано и она имеет тип __int64, если что.
Думаю, это то, что надо.

Psycho Tiger 26.07.2010 22:08

Ага, спасибо, буду пробовать.

alexcon314 10.08.2010 13:00

Еще небольшой довесок. Как Microsoft генерит коды активации.

Astraport 21.08.2010 01:51

Ребята, вы как докопаете, в чем я не сомневаюсь, то пожалуйста, поделитесь информацией в доступном виде. Это же не дело, что Air-приложения не имеют протектора. Захочешь продать, а никак:)

Psycho Tiger 21.08.2010 12:32

Ну, мы не для Air`а копаем. Если Air имеет какой нибудь шелл для запуска exe или скриптов как здесь - то без проблем, а так сомнительно)

Astraport 22.08.2010 13:22

Цитата:

Ну, мы не для Air`а копаем.
Ну какая разница кто будет проверять ID материнки? Главное - как. Разве Air это не сможет?

Psycho Tiger 22.08.2010 15:07

Самое лучшее, что сейчас нам пришло в голову (точнее alexcon`у :)) - это компилировать сишный код в exe, и через его обёртку вызывать метод, который выполнит этот exe и перехватит то, что он выплюнет, отдав во флешку. Air так не умеет. Ровно как и не умеет вызывать VBScript`ы для доступа к WMI...


Часовой пояс GMT +4, время: 20:39.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.