Форум 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...

Astraport 22.08.2010 16:54

А разве Air не может запустить сторонний exe (например созданный с помощью AutoIt), который запишет где-то в реестре уникальный ID машины? Ну а потом Air прочитает это значение в реестре.

Psycho Tiger 22.08.2010 17:46

Я не знаток AIR`а, но если он может сделать эти 2 операции - то в чем проблема? В теме всё остальное уже расписали, даже с примером программы =)

alexcon314 24.08.2010 10:33

Astraport, откройте хэлп по последней версии AIR, там было что-то новенькое и интересное в связи с запуском ехе и перенаправлением вывода stdout консольных утилит, где-то мелькало, сейчас прсото не найду.
Здесь речь идет совсем не об айре. Сейчас думаю вбацать-таки фичу с серийником винта и ID проца (cpuid call) в оболочку. Я туда пихаю все, что спрашивают на форуме :), традиционно.

serdmitriy 03.11.2010 00:03

air может запустить сторонний exe файл.
http://help.adobe.com/ru_RU/Flash/CS...veProcess.html

Astraport 12.06.2011 19:13

Возвращаясь к теме.

Смысл в том чтобы получить уникальный идентификатор компьютера пользователя.
Самый лучший вариант - это привязаться к материнской плате, т. к. её намного реже меняют (апгрейдят) по сравнению с жесткими дисками или процессорами.

Другой простой вариант - это привязка к Hardware address (он же MAC), но тут проблема в том, что юзер может его легко поменять и опять же зависит от материнки. Значит задача сводится к получению ID материнки, при этом желательно без сторонних файлов или скриптов по причине чрезвычайной жесткости антивирусов ко всяким подобным вещам. Так что вариант с другим exe или dll тоже не подходит.

alexcon314, вы не добавили функцию получения ID материнки в вашей библиотеке? Планируете?

alexcon314 13.06.2011 17:36

Серийный номер жкесткого диска добавил давно уже.. ID СPU по моим представлениям вещь тоже весьма условная, возможность получения оного весьма зависитот семейства, линейки, производителей и т.п.
Единообразного общего способа его получить я не вижу. К серийнику мамки я не подступался. Но это тоже не самая тривиальная задача, по моим представлениям, если опять же искать что-то общее и работоспособное. Так что не планирую, вряд ли.. не буду обещать.. Можно попробовать покопаться в биосе из проги, но опять же это не дает гарантий...
MS использует информацию о нескольких девайсах для генерации серийника. Причем, замена материнки, к примеру, равносильна потере лицензии на винду (OEM-версии).
Мое имхо - привязаться к серийнику винта вполне достаточно в подавляющем большинстве ситуаций.
Форсмажорная смена оного не такой уж частый случай. А разные там фокусы - ну, что уж там..
Нормальную защиту может дать свой драйвер и свой девайс типа usb-ключа. Но это уже несколько выходит за рамки..
Если кто-то предложит внятный алгоритм получения ID компа, можно подумать и о реализации, пока мне ничего толкового в голову не ришло, корме серийника винта.

Astraport 13.06.2011 18:11

Цитата:

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

MS использует информацию о нескольких девайсах для генерации серийника.
Чем больше девайсов, тем больше шансов проблем у юзера, если я его лицензию заблокирую при смене любого девайса. Так что нужен один, но редко меняемый. Винт - это хорошая идея, но я, например, сейчас их меняю раз в 1-2 года, вернее даже не меняю, а добавляю новые, оставляя прежний. При этом старый винт часто меняет букву, т. к. обычно параллельно обновляю винду на новый винт, т. е. если я привязываюсь к винту на С, то у юзера однозначно будут проблемы с лицензией.

А что скажите насчет MAC? Я правильно понял, что это уникальный номер для материнки?

alexcon314 14.06.2011 10:28

Цитата:

могу спросить как лучше это реализовать
Спросите, интересно.
Цитата:

я его лицензию заблокирую при смене любого девайса
Конечно, это напрягает пользователя, и что? Ищите простые варианты, но менее защищенные. Это уже технические детали. Важен сам принцип.
Ну, ваша практика с винтами - не показатель, согласитесь?
Потом, буква диска (логического тома) тут не при чем. Серийник - характеристика именно железяки. О нем речь. Он не меняется с изменением структуры логических разделов. Есть серийник тома, он назначается при создании логических разделов, это совсем другое.
MAC - это имеется в виду MAC сетевого интерфейса? Что сказать.. нормальный вариант, но послабее варианта с винтом, явно.
Значение MAC адреса указанное в настройках драйвера сетевой карты имеет приоритет перед аппаратным адресом. Лично мне никогда не приходилось менять мак сетевухи, думаю, многим "нормальным" пользователям тоже это ни о чем не говорит. Но все же, поменять его несложно при желании.

Да, про привязку к мамке интересно, расскажите, жду.

Azrael 20.04.2018 15:21

Подскажите как получить идентификатор диска C: (аналог команды vol из командной строки). Из swf как я понял этого не сделать, устроит AIR.

~~~ 20.04.2018 21:52

Либо вызывать консольные утилиты как дочерний процесс, либо писать native ext под AIR.


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

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