gifts2017

Привязка конфигурации к диску

Опубликовал San Simonov (simgo83) в раздел Программирование - Защита и шифрование

Простой способ определить по id HDD, используют ли твою работу на постороннем компьютере

//Модуль приложения который можно запоролить или не включать в поставку

Процедура ПриНачалеРаботыСистемы()
ПодключитьОбработчикОжидания("ЗащитаОтДурака",60,Истина) ;

КонецПроцедуры()

Процедура ЗащитаОтДурака() экспорт
// Создаем объект FileSystemObject
FSO = Новый COMОбъект("Scripting.FileSystemObject");
// Получаем ссылку на объект
Drive = FSO.GetDrive("C") ;
//в конфу предварительно добавляем константу НомерС
Если константы.НомерС.Получить() <> Строка(Drive.SerialNumber) тогда
Предупреждение("Вы используете более одной копии программы! Обратитесь к разработчику");
ЗавершитьРаботуСистемы(Ложь);
Иначе
КонецЕсли
КонецПроцедуры; 

Для клиентов которые заплатили, устанавливаем номер константы обработкой ЗащитаОтДурака.epf в первые 60 секунд работы системы и работаем)

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
ЗащитаОтДурака.epf
.epf 5,96Kb
12.02.13
227
.epf 5,96Kb 227 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Сергей Тучин (SergeyT2006) 14.04.10 03:13
А если с базой работают несколько пользователей? Или база на одной машине, а запускаем по сети? Диск будет определяться для локальной машины.
Однобокая система защиты какая-то ;)
2. Дмитрий Бухалов (Re:аниматор) 14.04.10 04:39
Термин "ЗащитаОтДурака" имеет другой смысл ...
3. Alexandr_P (Русский) 14.04.10 05:06
Кому надо, те используют ключи HASP, вынося часть конфы в DLL, и привязав эту DLL к ID ключа HASP.
4. Алексей Константинов (alexk-is) 14.04.10 08:14
(0) Выглядит как-то сыровато. Программный код можно было бы раскрасить получше.
5. shurik_shurik (shurik_shurik) 14.04.10 08:51
Как для простенькой конфы на одного пользователя.... пройдет..
Или ввести в конфу закрытый справочник серийных номеров, можна даже контролировать количество лицензий...
Или не справочник, а закрытый код с жестко прописаными серийниками, или.......
Вариантов масса....
6. Dmitry Po (DMon) 14.04.10 09:36
Не очень практично. А если у пользователя вышел из строя винт? ...или переустановили операционную систему (при этом установив другой винчестер и грузятся с него)? Как вариант простенькой защиты - пойдет! :)
7. Дмитрий Бухалов (Re:аниматор) 14.04.10 11:17
ПодключитьОбработчикОжидания("ЗащитаОтДурака",60,Истина) ;

а зачем обработчик? разве при начале работы нельзя это проверять? или предполагается что винты на ходу будут меняться)))
8. San Simonov (simgo83) 14.04.10 11:21
(7) нет не на ходу)))), фантазия у Вас конечно есть)
пауза в 60 секунд для "Для клиентов которые заплатили, устанавливаем номер константы обработкой ЗащитаОтДурака.epf в первые 60 секунд работы системы и работаем)"
9. qaz (pricec) 14.04.10 13:08
использую такой прием в своих разработках - идея вполне работоспособная.По трудозатратом не сравнима с dll(тоже кстати делал на с++).А вариант с хаспом стоит денег.Так что для небольшого авторского коллектива этот вариант самое то! Всем рекомендую.
10. Дмитрий Воробьев (vde69) 14.04.10 14:00
вся эта защита строится на закритии модуля приложения...
нельзя закрывать его!!! ни один нормальный заказчик не купит такую конфу.

закрыть можно отдельный модуль, но не глобальный...
11. Александр Орефков (orefkov) 14.04.10 14:18
Насколько я помню, drive.SerialNumber использует для работы метод WinAPI GetVolumeInformation - который возвращает не "железный" серийный номер харда, а программный серийный номер тома (volume serial number), устанавливаемый при форматировании раздела.
Данный номер может как измениться при переформатировании раздела, так и быть изменен программно для любого раздела на требуемый.
Получение настоящего серийного номера харда, зашиваемого производителем индивидуально для каждого винта - несколько более сложная задача.
12. Sergey (ra9000) 14.04.10 15:01
13. San Simonov (simgo83) 14.04.10 16:03
(11) давайте подумаем как узнать из 1с "Получение настоящего серийного номера харда, зашиваемого производителем индивидуально для каждого винта - несколько более сложная задача."
14. Валерий Агеев (awa) 14.04.10 18:30
Ничего нового в статье нет, всё это давно описано, например Простые примеры реализации демо-версий обработок на платформе «1С:Предприятие 8».
Неплохо бы пользоваться поиском по сайту прежде чем размещать свои публикации.
venger; simgo83; +2 Ответить
15. Александр Орефков (orefkov) 14.04.10 21:43
(13)
А что тут думать - прыгать надо.
Если серьезно - зависит от оси.
Под 9х использовалась дыра, через которую можно было выполнить свой код в ring0, напрямую обращаясь к устройству, под 2К - через обращение к драйверу диска (но вроде не работало со флэшками). Это все требует WinAPI, то есть реализуемо через ВК. Под XP и старше - точно не знаю, вроде бы появилась возможность через WMI, но я лично не проверял. Это уже можно сделать и без ВК, на VBScript'е.
Ну а так метод сойдет, как первый ров перед крепостной стеной. Крестьянское ополчение остановит, пехоту чуть задержит. Кавалерия перескочит.
Synoecium; venger; +2 Ответить 3
16. Александр Венгер (venger) 14.04.10 23:52
(15) На локальном компе средствами WMI вывод всех свойств и их значений WMI класса Win32_DiskDrive (информация о дисковых накопителях HDD):
	Попытка
		Locator = Новый COMОбъект("WbemScripting.SWbemLocator");
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
	ServicesSet = Locator.ConnectServer(".");
	ObjectSet = ServicesSet.InstancesOf("Win32_DiskDrive");
	Для Каждого Item Из ObjectSet Цикл
		Для Каждого Свойство Из Item.Properties_ Цикл
			Сообщить(Свойство.Name + " = " + Свойство.Value);
		КонецЦикла;			
	КонецЦикла;

...Показать Скрыть

17. Александр Венгер (venger) 14.04.10 23:57
(15) +16, в классе WMI "Win32_LogicalDisk" искать бесполезно, логические диски, а так вроде средствами WMI все, помимо "Win32_DiskDrive"...
18. Александр Венгер (venger) 15.04.10 00:03
(15) +17, помимо класса "Win32_DiskDrive", но что, например, в свойстве "PNPDeviceID" этого класса, есть там серийник харда или нет.У меня, например, там и производитель, и модель, а потом наверно серийник...
19. Александр Орефков (orefkov) 15.04.10 09:04
Ну и вот http://technet.microsoft.com/ru-ru/sysinternals/bb897436.aspx - прога от микрософта, позволяющая установить желаемый volume serial number.
20. San Simonov (simgo83) 15.04.10 10:53
а может серийник диска брать из реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Disk\En­um
смотрите значение параметра "0"
21. Александр Венгер (venger) 15.04.10 11:51
(20) Это тоже, что и (только если дисков несколько или вставлены флешки, то будет параметр не только 0, но и 1, и 2 8-) ):
	Locator = Новый COMОбъект("WbemScripting.SWbemLocator");
	ServicesSet = Locator.ConnectServer(".");
	ObjectSet = ServicesSet.InstancesOf("Win32_DiskDrive");
	Для Каждого Item Из ObjectSet Цикл
		Сообщить(Item.Caption+": "+Item.PNPDeviceID);
	КонецЦикла; 
...Показать Скрыть
22. Александр Венгер (venger) 15.04.10 12:34
(20) +21, а это из реестра вариант, из ветки, что предложена в 20-м посте, тот же результат:
	Locator = Новый COMОбъект("WbemScripting.SWbemLocator");
	ServicesSet = Locator.ConnectServer(".");
	ObjectSet = ServicesSet.InstancesOf("Win32_ComputerSystem");
	ИмяКомпьютера="";
	Для Каждого Item Из ObjectSet Цикл
		ИмяКомпьютера=Item.Name;
	КонецЦикла; 	
	Значение="";
	HKEY_LOCAL_MACHINE = 2147483650;
	ПутьККлючу = "SYSTEM\CurrentControlSet\Services\Disk\Enum";
	ИмяПараметра = "0";
	Reg = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\" +
	ИмяКомпьютера + "\root\default:StdRegProv");
	Reg.GetStringValue(HKEY_LOCAL_MACHINE, ПутьККлючу, ИмяПараметра, Значение);
	Сообщить("Значение параметра ветки реестра: " + Значение);	
	Пока ПустаяСтрока(СокрЛП(Значение))=Ложь Цикл	
		ИмяПараметра=Строка((Число(ИмяПараметра)+1));
		Reg.GetStringValue(HKEY_LOCAL_MACHINE, ПутьККлючу, ИмяПараметра, Значение);
		Если ПустаяСтрока(СокрЛП(Значение))=Ложь Тогда
			Сообщить("Значение параметра ветки реестра: " + Значение);	
		Иначе
			Прервать;
		КонецЕсли;
	КонецЦикла;
...Показать Скрыть
23. San Simonov (simgo83) 15.04.10 12:39
Есть у кого опыт определения серийника через SCSI комманды???, т.к. WMI уже формируется на основе данных, предоставляемых ДРОВАМИ!!!, и как там сформировано будет от версии к версии - неизвестно. Насколько я знаю(если что не так - поправьте), там постфиксы добавляются, если серийник короче скольких-то символов.
"IDE\DiskST3500418AS_____________________________CC38____\5&­1726dd96&0&0.0.0"
24. Александр Венгер (venger) 15.04.10 12:46
(23) После второго слеша и идет серийник, скорее всего...
25. igor_gk (igor_gk) 15.04.10 18:16
26. Юрий (YRAtomic) 17.04.10 16:11
Ну вот привязались к диску :)))

Есть же еще куча железа с айдишками
27. Александр Венгер (venger) 19.04.10 10:57
28. San Simonov (simgo83) 19.04.10 18:46
(27)для варианта с процессором какой скрипт нужно тогда использовать?
29. Денис Денин (MrDen) 20.04.10 00:33
Если код закрытый, то можно привязываться к чему угодно, иначе не стоит
Параметры можно брать разные и HDD, и системы и тд. и тп.
30. Александр Венгер (venger) 20.04.10 11:39
(28) Если для локального компа, то примерно так:
	Попытка
		Locator = Новый COMОбъект("WbemScripting.SWbemLocator");
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
	ServicesSet = Locator.ConnectServer(".");
	ObjectSet = ServicesSet.InstancesOf("Win32_Processor");
	Для Каждого Item Из ObjectSet Цикл
		Сообщить("ProcessorId: "+Item.ProcessorId);
	КонецЦикла; 
...Показать Скрыть
31. Юрий Писарев (Yurken) 21.04.10 09:25
А как это реализовать на 7.7
32. Александр Венгер (venger) 21.04.10 14:43
(31) Например, так: http://infostart.ru/public/69066/

Я имею ввиду доступ к WMI, остальное по 7.7 очевидно....
33. arjuna (arjuna) 23.04.10 19:30
удалено, уже все написано в предыдущем посте.
34. Vadim A (avavadim) 07.10.11 22:08
Спасибо за полезную мысль которую можно доработать...
35. Andrey Krapivin (kr_andr) 23.11.11 11:03
37. Maxim Kolkin (the1) 23.07.13 00:06
я бы автоматизировал процесс установки константы

Если константы.НомерС.Получить() = "" тогда // первый запуск
константы.НомерС.Установить(Строка(Drive.SerialNumber))
ИначеЕсли константы.НомерС.Получить() <> Строка(Drive.SerialNumber) тогда
Предупреждение("Вы используете более одной копии программы! Обратитесь к разработчику");
ЗавершитьРаботуСистемы(Ложь);
КонецЕсли
...Показать Скрыть


А по сабжу конечно очень ограниченное применение найдется
38. Андрей Тарлыков (Tarlich) 11.10.13 23:42
т.е такое решение актуально если база не сетевая и пользуется на одном компе
Интересно : а если константу НомерС сделать ХранилишемЗначений
ТЗ и хранить серийники винтов , проверять при открытии ....
39. Бондарчук Тарас (Bond) 14.10.14 16:22
Кто подскажет, для проверки номера серийника процессора, можно ли вызвать функцию на сервере и получить данные сервера? или так или иначе будет возвращать номер локального компа?
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа