Ограничение достпу к файлу для всех программ, кроме одной

469
31 января 2017, 19:58

Здравствуйте, пишу программу для возможности задания ограничения на открытие файла для всех программ, кроме определенной (по возможности той которую выберет пользователь), например для "блокнота" (что бы открыть данный файл имела право только программа "Блокнот").

Подскажите в каком направлении искать?

Я находил как можно задать ограничение для определенных пользователей

 FileSystemAccessRule rule = new FileSystemAccessRule(
            currentUser.User,
            FileSystemRights.Read,
            AccessControlType.Deny);

но для программ и процессов так и не смог найти.

Answer 1

Вопрос довольно обширный, так что и ответ будет скорее к размышлению, чем к действию.

Что нужно помнить

  1. От пользователя с правами администратора доступ к любым файлам, включая системные, заблокировать нельзя. Администратор всегда может предоставить себе доступ к любому файлу, правда иногда для этого нужна голова и руки из нужного места, но тем не менее.

  2. Некоторые программы умеют обходить любые ограничения прав доступа уровня файловой системы используя специальные права, предназначенные для бекапа и восстановления.

  3. Любые программы и процессы запускаются от имени определенного пользователя, поэтому и права задаются для пользователей.

Как можно сделать

  1. Во время установки программы

    1.1 Создаем специального пользователя для программы с необходимыми правами и отключенным интерактивным входом в систему. От имени этого пользователя будем запускать программу, но обычный вход в систему под этим пользователем не нужен.

    1.2 Создаем ярлыки для запуска программы от имени созданного пользователя, во всех необходимых местах (рабочий стол, пуск и т.д.)

  2. Во время первого запуска

    2.1 Создаем необходимые файлы и папки (программа запущена от имени созданного пользователя)

    2.2 Создаем, если еще не создана, отдельную запись в ACL необходимых файлов и папок для созданного пользователя и удаляем все записи, унаследованные от родительских объектов файловой системы и не связанные с созданным пользователем

  3. ???

  4. Profit!

По идее первые все перечисленное можно выполнить во время первого запуска, но после выполнения нужно перезапустить программу. Или, выполнять все это в специальном лаунчере, там же заодно можно и проверять состояние нужных объектов перед запуском и принимать решение запускать программу или нет.

Как то так я это вижу. Для большей безопасности, можно с некоторой периодичностью проверять права доступа к необходимым объектам и восстанавливать их, в случае изменения или предпринимать какие-либо еще действия для защиты себя любимого от лап пользователя.

Альтернатива (если такое допустимо)

Если нужна защита только от чтения, то можно просто зашифровать необходимые файлы каким-нибудь симметричным алгоритмом, достаточно стойким, но при этом быстрым. Это спасет от доступа к данным, но не спасет от банального удаления файла.

Для .NET я не вижу других вариантов. Все остальные способы, включая чисто теоретические, требуют более низкоуровневых возможностей, которые доступны только в нативном коде.

READ ALSO
Кэшированый делегат в C#

Кэшированый делегат в C#

Что значит фраза "делегат кэшируется" в этом контексте (и вообще, что такое "кэшированный делегат и для чего он):

335
WPF. Messagebox. Как поменять стиль диалогового окна?

WPF. Messagebox. Как поменять стиль диалогового окна?

Стандартный стиль не вписывается в мой дизайн, а вся валидация идет через MessageboxShow("Сообщение")

753
получить элемент списка xaml

получить элемент списка xaml

есть список lisview с кнопками внутрикак можно получить элемент списка и объект данных, кликнув по какой-либо кнопке внутри него ?

370