Задался целью обезопасить учетную рабочую таблицу чтобы файл Excel работал только на определенном компе - а если на других открываешь файл самоуничтожается Нашел замечательный код здесь http://www.programmersforum.ru/showthread.php?t=36480 от уважаемого EducatedFool
Код
Private Sub Workbook_Open()
Const My_Drive_C_SerialNumber = "12345678" ' сюда пишем серийный номер своего диска
If Drive_C_SerialNumber <> My_Drive_C_SerialNumber Then
MsgBox "Вы пытаетесь открыть файл на другом компьютере", vbCritical, "Нет доступа"
Application.DisplayAlerts = False
newsh = ThisWorkbook.Worksheets.Add.Name ' создаём пустой лист
For Each sh In ThisWorkbook.Worksheets
If sh.Name <> newsh Then sh.Delete ' удаляем все листы этого файла, кроме пустого
Next
ThisWorkbook.Save
ThisWorkbook.Close False
End If
End Sub
Function Drive_C_SerialNumber() As String
Drive_C_SerialNumber = CreateObject("scripting.filesystemobject").GetDrive("c:\").SerialNumber
End Function
При тесте узнал предварительно серийник диска С своего компьютера (через командную строку сделать wmic diskdrive get model,name,serialnumber ) , ввожу свой серийник диска С и пробую запустить на своем же компьютере - но вываливается MsgBox "Вы пытаетесь открыть файл на другом компьютере" хотя серийник ввел правильно 100% (перепроверил серийный номер другими прогами) В чем может быть ошибка - серийник диска обычно выдается большими буквами типа JPS930N11PNDRV - может маленькими надо вводить или что в коде поправить ?
я к сожалению чайник в VBA и даже не понимаю как это сделать в UCase Код выше срабатывает на уничтожение информации - создает пустой лист и удаляет листы с информацией - но почему родной серийник не воспринимает ?
У меня вот такое выдало по коду Catboyun "-1861936793" число с минусом (ячейка A1 в текстовом формате) это число с минусом без минуса вводить как серийный номер ?
Это код логического диска. Хотите серийнный номер , тогда WMI
Код
Sub GetDiskSerialNumvbers()
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("select * from Win32_DiskDrive")
For Each objItem In colItems
Debug.Print "SerialNumber: " & objItem.SerialNumber
Next
End Sub
Sub GetVolumeSerialNumbers()
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("select * from Win32_LogicalDisk")
For Each objItem In colItems
Debug.Print "Volume Serial Number: " & objItem.VolumeSerialNumber
Next
End Sub
но может быть несколько дисков.
А то что у вас - 1861936793 - это серийный номер тома FFFFFFFF A2E6BC67 в HEX. A2E6BC67 выдаст скорее всего GetVolumeSerialNumbers, но Если я правильно помню, при клонировании этот серийник сохраняется.
Благодарю БМВ за ответ -понял. Еще один вопрос если можно - реализация защиты по полному пути файла Excel на этих же принципах можно реализовать ? как понимаю тут Function Drive_C_SerialNumber() As String будет просто другая например - как прописать путь файла ? те 2 защиты совместить - если файл будут пытаться открыть на другом компе или из другой папки (или даже просто переименовав файл)
Код
Function ПутьФайла() As String ' функция по полному пути файла
..................................... как прописать путь файла ?
End Function
давайте представуим меня в роли злоумышленника и я отключил макросы в Excel и что дальше делать Вашей защите??? (с самоуничтожением, с привязкой к серийному номеру и со всеми прочими макросами, проверяющими легальность использования файла?) займитесь чем-то созидательным...
Ігор Гончаренко, ну есть нормальные примеры реализации, не идеальной, но всеж защиты, когда файл открытый на компе с отключенными макросами просто ничего не покажет кроме рекомендации включить макросы и это хоть немного прикрывает тылы и это делается не сложно. Не у Дмитрия ли встречал на сайте. Другое дело, что знать бы что защищаем :-)? Тут с Вами согласен.
БМВ, нет в Excel приемлемой защиты данных, кроме пароля на открытия файла.
Цитата
БМВ написал: не идеальной, но всеж защиты, когда файл открытый на компе с отключенными макросами просто ничего не покажет кроме рекомендации включить макросы
снимаем пароль с VBA проекта (если он есть), открываем сильно скрытие листы - всё. Всё это поиграться для начинающих.
Напомнило цитату А вообще если по теме, зачем вам от переименования или адреса защищать? Это Excel файл и у него предназначение ползать туда куда его положат. А если я файл на флешку закинул и открыл дома, получается я не могу с ним дома работать?
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок. А в том, чтобы писать программы, работающие при любом количестве ошибок.
Те как понимаю для бм защиты нужно 3 вида защиты 1)Защита на отключение макросов 2)Защита с самоуничтожением по серийному номеру при переносе на другой комп 3)Защита с самоуничтожением по пути файла и имени файла ну и запаролить VBA
"Alemox написал: А вообще если по теме, зачем вам от переименования или адреса защищать? Это Excel файл и у него предназначение ползать туда куда его положат. А если я файл на флешку закинул и открыл дома, получается я не могу с ним дома работать?" да предполагается что пользователь только на рабочем может пользоваться например базой данных и пр - если захочет уволочь с флешкой - то не получится
я не буду обсуждать тему взломов, но надежда на защиту сделанную дилетанскими способоми - как минимум просто наивна oleg355, и чем меньше Вы обсуждаете способы защиты на публичных форумах, тем больше вероятности, что хоть что-то получиться
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
У вас там база данных для FBI. Что-то у нас все жадными стали до того, что они что-то придумали причём на работе скорее всего. Такое ощущение будто 1С свою написали. Чуваки OS с открытым кодом пишут и программы, которыми пользуются миллионы, а тут файлик, на который миллион защитных уровней. Как вариант ещё рассмотрите защиту через реестр. Чтобы уж наверняка.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок. А в том, чтобы писать программы, работающие при любом количестве ошибок.
Все ваши варианты решаются на раз. Профи будет лень что-то ломать, если он быстрее сделает сам. Разве из спортивного интереса, но это с опытом проходит, начинаешь уважать труд коллег.
По опыту форумному: обычно с вопросами защиты выходят те, у кого и защищать-то особо нечего. А вот где посерьезнее, где есть что прятать - разработчики уже на таком уровне, когда сами знают, как защищаться, или ищут способы защиты не так открыто. Уверен, у каждого, кто этим "страдает", есть свои секреты и любимые методы. И делиться ими налево и направо не будут.
oleg355, если уж Вам так приспичило защищаться, подсказываю простой способ по принципу отца Брауна 1. Разархивируете файл WinRAR-ом 2. Архивируете обратно, с паролем 3. Переименовываете во-что-нибудь нафиг никому не нужное, типа "Фотачки Нюты.rar"
Если нужна привязка к жесткому диску, - лучше использовать такую функцию http://excelvba.ru/code/HardwareID но она работает не всегда (почему - не знаю, как-то поднимал эту тему на форуме уже), потому, надо комбинировать с другими идентификаторами в случае ошибки WMI