Таким образом, чтобы выполнить такую задачу, я бы использовал ACL из NTFS. Да, он «жестко закодирован» и не может быть изменен, пока кто-то обращается к файлу. Но вы можете написать службу Windows, которая будет динамически изменять ACL в зависимости от того, что вам нравится.
Итак, напишите программу, которая изменяет ACL, а Windows делает все остальное. Некоторые примеры выполнения такой задачи в C # можно найти в небольшом поиске Google:
Обновление
Для предоставления или отклонения разрешения вам необходим набор правил. Эти правила могут быть проверены в вашем приложении, и это устанавливает разрешения NTFS. Чего не хватает?
Может быть, у вас нет такого простого способа получить событие о том, что «пользователь обращается к файлу / папке foo, что мне делать?». Но вы можете генерировать каждую секунду (если хотите) или в зависимости от события (файл / папка созданы, скопированы, удалены, переименованы; достигнута конкретная дата / время) новый набор правил и просто записать его в ACL. Закончено.
Обновление (снова)
@ Равиша: Но когда вы знаете правила, если вы предоставляете или запрещаете доступ? Эти правила определены заранее.
Вы говорите, что пользователь X имеет доступ только с 8:00 до 15:00 или только если файл y существует (или что-то особенное записано в файл y). Для всех этих правил вы должны написать программу, и эта программа не оценивает правила, если вы получили событие «x пытается получить доступ к y». Вместо этого вы проверяете правила на регулярной основе (например, раз в минуту) или какое-либо другое событие (файл rules.config был изменен). А затем вы изменяете разрешения NTFS в соответствии со своими правилами.
Может быть, это не идеальное решение 1028 *. Но самое простое, что вы можете сделать в Windows. Если вам действительно нравится делать это трудным путем, вы можете взглянуть на Драйверы фильтра файловой системы . Но это сложная задача, далеко от управляемого кода.