Как проверить наличие разрешения на запись в каталог в.NET, когда "Доступ к контролируемой папке" включен

При попытке создать папку в "Мои документы" с "Доступом к управляемой папке" ON CreateFolder выдает исключение FileNotFoundException. Мне нужно проверить, может ли мое приложение создать папку в Моих документах. Как я могу проверить, что у меня есть разрешение на это, когда "Доступ к контролируемой папке" включен.

Я попробовал для этого метод DirectoryInfo.GetAccessControl, он показывает, что позволяет. Это единственный способ для меня, чтобы попытаться создать папку и обработать исключение FileNotFoundException.

try
{
    Directory.CreateDirectory(Path.Combine(MyDocuments, "Foo"));
}
catch (FileNotFoundException)
{
    //Do something
}

1 ответ

Лучший способ справиться с этим - проверить пару вещей.

  1. Проверьте, включен ли контролируемый доступ к папкам на компьютере
  2. Если он включен, проверьте, не было ли ваше приложение освобождено от контроля.

Это делается путем проверки ключа реестра локального компьютера:

HKLM\SOFTWARE\Policies\Microsoft\Windows Defender\Windows Defender Exploit Guard\Controlled Folder Access

  1. Прочтите значение для EnableControlledFolderAccess(1 включен, 0 - отключен) - обратите внимание, что это тоже может быть ничего!
  2. Прокрутите SubKeyNames тогда GetValueNames() для ключа AllowedApplications- (возвращает массив строк)

Если включен контролируемый доступ к папкам и имя вашего приложения (Assembly.GetExecutingAssembly().ManifestModule.Name) отсутствует в списке AllowedApplications, то вы получите FileNotFoundException и не сможет создать папку (пользователь также получит предупреждение о вирусе!).

РЕДАКТИРОВАТЬ:

В этом улье есть еще один подключ, ProtectedFoldersв котором перечислены папки по умолчанию, которые Microsoft решила защитить (включая такие папки, как "Мои документы", "Мои изображения" и т. д.), а также любые другие папки, которые может добавить пользователь (администратор). Вы также можете проверить это (строковый массив), если в системе включен контролируемый доступ к папкам.

FileNotFoundException здесь, конечно, неожиданно Directory.CreateDirectory отсутствует в списке документированных исключений. Это исключение, по-видимому, является результатом того, что Защитник Windows блокирует доступ вашего приложения к папке, а не файловой системе Windows, которая находится на более низком уровне, и, следовательно, System.IO дает вам успешный результат.

Проверьте эту ветку, как кажется, ваша ситуация. И самый последний комментарий предлагает разрешить приложение через список контролируемого доступа. Я подозреваю, что пока правильный тип исключения не будет реализован на низком уровне, вы застряли, ловя здесь недокументированное исключение. Там может быть какой-то недокументированный WinAPI, чтобы спросить Защитника Windows, есть ли у вашего приложения доступ к папке, но полагаться на него в долгосрочной перспективе может быть более подвержено ошибкам. Надеюсь, это поможет!

Другие вопросы по тегам