Как проверить наличие разрешения на запись в каталог в.NET, когда "Доступ к контролируемой папке" включен
При попытке создать папку в "Мои документы" с "Доступом к управляемой папке" ON CreateFolder выдает исключение FileNotFoundException. Мне нужно проверить, может ли мое приложение создать папку в Моих документах. Как я могу проверить, что у меня есть разрешение на это, когда "Доступ к контролируемой папке" включен.
Я попробовал для этого метод DirectoryInfo.GetAccessControl, он показывает, что позволяет. Это единственный способ для меня, чтобы попытаться создать папку и обработать исключение FileNotFoundException.
try
{
Directory.CreateDirectory(Path.Combine(MyDocuments, "Foo"));
}
catch (FileNotFoundException)
{
//Do something
}
1 ответ
Лучший способ справиться с этим - проверить пару вещей.
- Проверьте, включен ли контролируемый доступ к папкам на компьютере
- Если он включен, проверьте, не было ли ваше приложение освобождено от контроля.
Это делается путем проверки ключа реестра локального компьютера:
HKLM\SOFTWARE\Policies\Microsoft\Windows Defender\Windows Defender Exploit Guard\Controlled Folder Access
- Прочтите значение для
EnableControlledFolderAccess
(1 включен, 0 - отключен) - обратите внимание, что это тоже может быть ничего! - Прокрутите
SubKeyNames
тогдаGetValueNames()
для ключаAllowedApplications
- (возвращает массив строк)
Если включен контролируемый доступ к папкам и имя вашего приложения (Assembly.GetExecutingAssembly().ManifestModule.Name
) отсутствует в списке AllowedApplications, то вы получите FileNotFoundException
и не сможет создать папку (пользователь также получит предупреждение о вирусе!).
РЕДАКТИРОВАТЬ:
В этом улье есть еще один подключ, ProtectedFolders
в котором перечислены папки по умолчанию, которые Microsoft решила защитить (включая такие папки, как "Мои документы", "Мои изображения" и т. д.), а также любые другие папки, которые может добавить пользователь (администратор). Вы также можете проверить это (строковый массив), если в системе включен контролируемый доступ к папкам.
FileNotFoundException
здесь, конечно, неожиданно Directory.CreateDirectory
отсутствует в списке документированных исключений. Это исключение, по-видимому, является результатом того, что Защитник Windows блокирует доступ вашего приложения к папке, а не файловой системе Windows, которая находится на более низком уровне, и, следовательно, System.IO
дает вам успешный результат.
Проверьте эту ветку, как кажется, ваша ситуация. И самый последний комментарий предлагает разрешить приложение через список контролируемого доступа. Я подозреваю, что пока правильный тип исключения не будет реализован на низком уровне, вы застряли, ловя здесь недокументированное исключение. Там может быть какой-то недокументированный WinAPI, чтобы спросить Защитника Windows, есть ли у вашего приложения доступ к папке, но полагаться на него в долгосрочной перспективе может быть более подвержено ошибкам. Надеюсь, это поможет!