1

当尝试在“我的文档”中使用“受控文件夹访问”创建文件夹时,CreateFolder 会引发 FileNotFoundException。我需要检查我的应用程序是否可以在我的文档中创建文件夹。当“受控文件夹访问”打开时,我如何检查我是否拥有它的权限。

我尝试了 DirectoryInfo.GetAccessControl 方法,它表明它允许。现在是我尝试创建文件夹并处理 FileNotFoundException 的唯一方法。

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

2 回答 2

0

处理这个问题的最好方法是检查几件事。

  1. 检查计算机上是否启用了受控文件夹访问
  2. 如果已启用,则检查您的应用程序是否已从控制中豁免。

这是通过检查本地机器注册表项来完成的:

HKLM\SOFTWARE\Policies\Microsoft\Windows Defender\Windows Defender Exploit Guard\受控文件夹访问

  1. 读取EnableControlledFolderAccess(1 启用 0 禁用)的值 -请注意,这也可以是什么!
  2. 通过SubKeyNamesthen循环GetValueNames()AllowedApplications- (返回一个字符串数组)

如果启用了受控文件夹访问并且您的应用程序名称 ( Assembly.GetExecutingAssembly().ManifestModule.Name) 不在 AllowedApplications 列表中,那么您将获得FileNotFoundException并且无法创建文件夹(用户还将收到病毒警告!)。

编辑:

该配置单元下还有另一个子项,ProtectedFolders其中列出了 Microsoft 决定需要保护的默认文件夹(包括“我的文档”、“我的图片”等文件夹)以及用户(管理员)可能添加的任何其他文件夹。如果系统上启用了受控文件夹访问,您还可以检查此(字符串数组)。

于 2020-01-19T15:13:56.983 回答
0

FileNotFoundException肯定是出乎意料的,因为在记录的异常Directory.CreateDirectory列表中没有它。此异常似乎是 Windows Defender 阻止您的应用程序访问文件夹而不是较低级别的 Windows 文件系统的结果,因此它给您一个成功的结果。System.IO

检查这个线程,因为它似乎是你的情况。最后一条评论建议通过受控访问列表允许该应用程序。我怀疑在低级别实现正确的异常类型之前,您几乎无法在此处捕获未记录的异常。可能有一些未记录的 WinAPI 会询问 Windows Defender 您的应用是否有权访问该文件夹,但从长远来看,依赖它可能更容易出错。希望能帮助到你!

于 2019-06-21T13:04:04.653 回答