Интересует вопрос доступа (а точнее причины его отсутствия) к файлу (папке\диску)
Те на входе мы имеем какой-то путь от пользователя и нам нужно открыть файл (убедившись предварительно что это именно файл), но по множеству разных причин можем получить ошибку и хотелось бы в подробностях показать пользователю в чем проблема. Аналогично при попытке записи, если доступ на чтение есть.
Как я это вижу, есть три основных момента:
если что-то не учел - дополните список
Итак, по логике нужно было бы сначала проверить атрибуты, что одновременно нам скажет существует ли объект, каков его тип (диск\папка\файл) и размер, однако при запрете через ACL, мы не сможем этого сделать
и получим ошибку "Отказано в доступе". Соответственно получив подобное пробуем проверить наш доступ. На этом моменте возникают вопросы - как проще и корректней это сделать.
Пока вариант такой:
На данном этапе смотрим, если права RW(E), то дело в залоченном дескрипторе, пробуем найти и показать имена процессов, чтобы пользователь сам принял решение что с этим делать (аудитория не домохозяйки, тут все оправдано).
Хотелось бы узнать насколько верен ход моих мыслей, может что-то стоит изменить, или добавить, возможно есть более эффективные альтернативы?
Те на входе мы имеем какой-то путь от пользователя и нам нужно открыть файл (убедившись предварительно что это именно файл), но по множеству разных причин можем получить ошибку и хотелось бы в подробностях показать пользователю в чем проблема. Аналогично при попытке записи, если доступ на чтение есть.
Как я это вижу, есть три основных момента:
- Права доступа ACL
- Атрибуты файла
- Блокировка дескриптора (тут все понятно)
если что-то не учел - дополните список
Итак, по логике нужно было бы сначала проверить атрибуты, что одновременно нам скажет существует ли объект, каков его тип (диск\папка\файл) и размер, однако при запрете через ACL, мы не сможем этого сделать
и получим ошибку "Отказано в доступе". Соответственно получив подобное пробуем проверить наш доступ. На этом моменте возникают вопросы - как проще и корректней это сделать.
Пока вариант такой:
- получаем SecurityDescriptor из пути через GetFileSecurity()
- получаем собственный ImpersonatedToken через OpenProcessToken()+DuplicateToken()
- проверяем права на объект через AccessCheck( SecurityDescriptor, ImpersonatedToken, DesiredAccess...)
На данном этапе смотрим, если права RW(E), то дело в залоченном дескрипторе, пробуем найти и показать имена процессов, чтобы пользователь сам принял решение что с этим делать (аудитория не домохозяйки, тут все оправдано).
Хотелось бы узнать насколько верен ход моих мыслей, может что-то стоит изменить, или добавить, возможно есть более эффективные альтернативы?