Назначение формы авторизации
Форма авторизации предназначена для разграничения прав пользователей при работе с документами Office, содержащими макросы.
При помощи данного инструмента вы можете реализовать различные пользовательские интерфейсы для сотрудников различных групп доступа, а также разграничить права отдельных пользователей программы.
Программа допускает создание неограниченного числа пользователей, каждый из которых принадлежит к одной из следующих групп: При первом запуске формы (или после того, как вы залогинитесь под правами администратора) становится доступной кнопка добавления и редактирования списка учётных записей. Для вызова формы авторизации используется функция GetNewAL, которая возвращает выбранный пользователем уровень доступа. Текущий уровень доступа хранится в глобальной переменной AL, таким образом, в любом месте кода вы можете использовать соответствующие проверки: Sub Main() If AL = AL_DEVELOPER Then Exit Sub ' этот макрос не надо запускать под учёткой разработчика If AL < AL_ADMINISTRATOR Then ' пользователь, или уверенный пользователь MsgBox "У вас недостаточно прав для выполнения этого действия", vbExclamation, "Недостаточно прав" ' предоставляем пользователю возможность ввести учётные данные администратора If GetNewAL >= AL_ADMINISTRATOR Then ' ваш код (пользователь залогинился как "администратор") End If End If End Sub
|
|||||||




Комментарии
Обалдеть!...
Это вы задаёте настройки для прав доступа макросов.
Т.е., например, макрос проверяет уровень доступа, и, если он равен 1, сообщает пользователю, что он не имеет права что-то там делать,
а если уровень доступа больше 5, - то выполняет действие без предупреждения.
Как-то так.
Это всё никак не сказывается на встроенном функционале Excel.
Чтобы подобное разграничение прав работало, надо защитить лист и книгу паролем,
и уже макросом, при уровне доступа больше определённого значения, временно снимать установленную защиту,
чтобы пользователь мог редактировать документ, или производить иные действия.
В коде есть строка AL_GUEST = 1
Создал пользователя с доступом 1.
Но он все равно может изменять документ, чего не должно происходить. Ведь он гость и не должен иметь права на редактирование документа.
Как-то возможно разрешить этот момент?
Спасибо.
А с чего они будут отображаться?
Вы код смотрели?
' предоставляем пользователю возможность авторизоваться
If GetNewAL >= AL_USER Then
' ваш код (пользователь удачно залогинился)
ИзменитьВидимостьЛистов True
End If
If AL >= AL_ADMINISTRATOR Then ' (пользователь залогинился как "администратор")
MsgBox "Приветствую вас, Администратор", vbInformation
End If
End Sub
Если вы задали константу AL_USER>1, то при AL = AL_GUEST = 1 условие не выполнится, и листы не будут отображены...
Напишите так:
' ваш код (пользователь удачно залогинился)
ИзменитьВидимостьЛистов True
End If
или
' ваш код (пользователь удачно залогинился)
ИзменитьВидимостьЛистов True
End If
или так:
' ваш код (пользователь удачно залогинился)
ИзменитьВидимостьЛистов True
End If
Странно, при гостевом доступе AL_GUEST = 1 не отображаются скрытые страницы. Хотя вроде как гость должен иметь право на их просмотр, но не редактирование.
Без этих строк теряется смысл этого обработчика...
Представим, что вы авторизовались под админом, внесли изменения, сохранили файл, потом нажали "крестик", и выбрали вариант "закрыть без сохранения".
В этом случае файл останется сохранённым с открытыми листами...
Названия именованным константам даны лишь для примера.
Вам ничто не мешает присваивать переменной AL любые значения (любые числа от -дофига до +дофига), без оглядки на константы.
Например, AL = 55, или AL = -48
Или же, для удобства использования в коде, изменить константы как угодно:
AL_UNKNOWN = 0
AL_GUEST = 1
AL_USER = 15
ADMINISTRATOR = 777
AL_ROOT = 1000
DUMMY = -666.6
End Enum
И еще. В настройках доступа пользователей присутствует диапазон от 1 до 9. А в аннотации к файлу указаны только четыре группы: пользователь, уверенный пользователь, администратор и разработчик. Если 9 - это разработчик, 3 - администратор, 2 - уверенный пользователь и 1 - пользователь, то зачем нужны 4,5,6,7 и 8? В принципе указанных четырех групп более чем достаточно и на этот вопрос можно не отвечать. Только вот еще хотелось бы создать группу 0 или -1, не важно. Это гостевая группа с доступом только для просмотра документа, но с обязательным вводом пароля. Есть такая возможность?
Спасибо. Только я не стал дописывать эти две строки:
MySave ' принудительно сохраняем файл
ThisWorkbook.Saved = True
Это для того чтобы оставить выбор при выходе в крестик сохранять или нет, а то сразу сохраняет и выходит из документа без предупреждения.
Можно попробовать добавить такой код в модуль книги:
AL = AL_UNKNOWN ' обнуляем уровень доступа
MySave ' принудительно сохраняем файл
ThisWorkbook.Saved = True
End Sub
Исправленный файл можно загрузить по ссылке http://excelvba.ru/XL_Files/Sample__18-12-2011__14-51-50.zip
Игорь, спасибо. Нужная вещь.
Есть одно замечание. Сразу скажу что использую Excel 2010. Так вот, если выходить из документа в крестик с сохранением, а не через кнопку "Выход", то при следующем запуске становятся видны все страницы, которые должны быть скрытыми, и полностью позволяют себя редактировать и без ввода пароля. Как бы избежать этого?
Игорь, подскажи, как присвоить листу уровень доступа?
Да, действительно, я когда качнул архив, сначала попробовал открыть файл прямо из него. Окошко для управления паролями появлялось.
Мне, вроде, понравилось. С трудом вышел без сохранения (открыто-то ведь было из архива).
Решил файл из архива вытащить и положить к себе в копилку. Тут-то при очередном его открытии и выяснилось, что управлять правами я больше не могу. А оказывается, что при первом запуске запись в реестр внеслась...
А как же мне по ходу юзания права редактировать, если я кнопочки для этого больше не увижу?
Но вообще-то идея с записями в реестр мне не нравится. Не хочу чтобы там мусор копился (а после удаления файла запись о нем в реестре становится мусором).
Может, не в реестр запоминать, а в ThisWorkbook.CustomDocumentProperties ?
А, может, вы когда-то уже запускали этот файл у себя на компе?
Вот что я вижу при открытии: http://ExcelVBA.ru/pictures/20110704-p4l-51kb.jpg
Дело в том, что при первом запуске программа делает запись в реестре.
Обратите внимание на эту функцию:
FirstRun = GetSetting(Application.Name, "Authentication", WORKBOOK_ID, "") = ""
End Function
и на эту константу:
В реестре появляется запись, что книга "123456" уже запускалась, и при следующем её открытии вы уже не увидите кнопки добавления (редактирования) учётных записей):
http://ExcelVBA.ru/pictures/20110704-1pg-43kb.jpg
Это не баг, это фича ))
Хотите изменить - просто добавьте директиву
первой строкой в модуль modAuth (но тогда и пароль перестанет быть чувствительным к регистру)
Лучше внести изменения в код проверки логина и пароля - чтобы только логин был нечувствительным:
' проверяет имя пользователя и пароль среди аккаунтов, сохранённых в файле
' если такая учётная запись присутствует, функция возвращает уровень доступа
On Error Resume Next
arr = AllAccountsArray(ThisWorkbook)
For i = LBound(arr) To UBound(arr)
If UCase(arr(i, 1)) = UCase(Login) And arr(i, 2) = Password Then
CheckAccount = arr(i, 3): Exit Function
End If
Next i
End Function
А вы не отказывайтесь)))
Решить проблему можно, немного изменив код в модуле книги:
' запрещаем сохранение файла под другим именем
If Not SaveAsUI Then MySave Else Cancel = True ' отменяем встроенную команду сохранения файла
End Sub
Прикрепил к статье исправленный файл.
Что-то у меня на начальную форму при первом запуске не выходит...
Сразу - на запрос логина-пароля.
Только, забравшись в код, смог войти с супер-правами как EducatedFool и изменить логин-пароль.
Выяснил недостаток: Login - Case Sensitive - не удобно, т.к. обычно - нет.
Ещё: не могу закрыть файл. Жму крестик. Отвечаю "сохранить". Прога думает 0,5 сек. и опять спрашивает "Сохранить?". И так, пока не откажусь.
Блин офигенная штука, спасибо что расщедрился!!!!
Изначально никаких пар "логин-пароль" в файле не прописано.
При первом запуске файла вы задаёте главную учётную запись (с максимальными правами), а потом уже под ней заходите, если требуется добавить новые, или отредактировать существующие учётки.
Пароль на проект VBA: 1 (единица)
а пароль какой с логином?
Отправить комментарий