Здравствуйте, пишу программу для возможности задания ограничения на открытие файла для всех программ, кроме определенной (по возможности той которую выберет пользователь), например для "блокнота" (что бы открыть данный файл имела право только программа "Блокнот").
Подскажите в каком направлении искать?
Я находил как можно задать ограничение для определенных пользователей
FileSystemAccessRule rule = new FileSystemAccessRule(
currentUser.User,
FileSystemRights.Read,
AccessControlType.Deny);
но для программ и процессов так и не смог найти.
Вопрос довольно обширный, так что и ответ будет скорее к размышлению, чем к действию.
Что нужно помнить
От пользователя с правами администратора доступ к любым файлам, включая системные, заблокировать нельзя. Администратор всегда может предоставить себе доступ к любому файлу, правда иногда для этого нужна голова и руки из нужного места, но тем не менее.
Некоторые программы умеют обходить любые ограничения прав доступа уровня файловой системы используя специальные права, предназначенные для бекапа и восстановления.
Любые программы и процессы запускаются от имени определенного пользователя, поэтому и права задаются для пользователей.
Как можно сделать
Во время установки программы
1.1 Создаем специального пользователя для программы с необходимыми правами и отключенным интерактивным входом в систему. От имени этого пользователя будем запускать программу, но обычный вход в систему под этим пользователем не нужен.
1.2 Создаем ярлыки для запуска программы от имени созданного пользователя, во всех необходимых местах (рабочий стол, пуск и т.д.)
Во время первого запуска
2.1 Создаем необходимые файлы и папки (программа запущена от имени созданного пользователя)
2.2 Создаем, если еще не создана, отдельную запись в ACL необходимых файлов и папок для созданного пользователя и удаляем все записи, унаследованные от родительских объектов файловой системы и не связанные с созданным пользователем
???
Profit!
По идее первые все перечисленное можно выполнить во время первого запуска, но после выполнения нужно перезапустить программу. Или, выполнять все это в специальном лаунчере, там же заодно можно и проверять состояние нужных объектов перед запуском и принимать решение запускать программу или нет.
Как то так я это вижу. Для большей безопасности, можно с некоторой периодичностью проверять права доступа к необходимым объектам и восстанавливать их, в случае изменения или предпринимать какие-либо еще действия для защиты себя любимого от лап пользователя.
Альтернатива (если такое допустимо)
Если нужна защита только от чтения, то можно просто зашифровать необходимые файлы каким-нибудь симметричным алгоритмом, достаточно стойким, но при этом быстрым. Это спасет от доступа к данным, но не спасет от банального удаления файла.
Для .NET я не вижу других вариантов. Все остальные способы, включая чисто теоретические, требуют более низкоуровневых возможностей, которые доступны только в нативном коде.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Что значит фраза "делегат кэшируется" в этом контексте (и вообще, что такое "кэшированный делегат и для чего он):
Стандартный стиль не вписывается в мой дизайн, а вся валидация идет через MessageboxShow("Сообщение")
есть список lisview с кнопками внутрикак можно получить элемент списка и объект данных, кликнув по какой-либо кнопке внутри него ?