当“受控文件夹访问”打开时如何检查 .NET 中的目录写入权限

Posted

技术标签:

【中文标题】当“受控文件夹访问”打开时如何检查 .NET 中的目录写入权限【英文标题】:How to check for directory write permission in .NET when 'Controlled folder access' ON 【发布时间】:2019-11-04 07:34:45 【问题描述】:

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

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

try

    Directory.CreateDirectory(Path.Combine(MyDocuments, "Foo"));

catch (FileNotFoundException)

    //Do something

【问题讨论】:

看来此链接可能对您有帮助 here 和 this one @PowerMouse 我看到了这个链接,他们建议使用 DirectoryInfo.GetAccessControl,不幸的是它表明我有完全访问权限 AFAIK 这严格来说是用户设置。您可以授予每个应用程序恕我直言的权限。 windows-10-allow-blocked-app-windows-security @PowerMouse 是的,这是用户设置。我想向最终用户展示如何添加它的说明,但在此之前我需要知道原因是否是“受控文件夹访问”。也许它有任何 WinApi 标志等等。 【参考方案1】:

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

    检查计算机上是否启用了受控文件夹访问 如果已启用,请检查您的应用程序是否已免除控制。

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

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

    读取EnableControlledFolderAccess 的值(1 启用,0 禁用)-请注意,这也可以是空! 循环遍历SubKeyNames 然后GetValueNames() 的键AllowedApplications - (返回一个字符串数组)

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

编辑:

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

【讨论】:

【参考方案2】:

FileNotFoundException 在这里肯定是出乎意料的,因为Directory.CreateDirectory 在documented exceptions 的列表中没有它。此异常似乎是 Windows Defender 阻止您的应用访问文件夹而不是较低级别的 Windows 文件系统的结果,因此 System.IO 为您提供了成功的结果。

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

【讨论】:

是的,我看到了,但我需要它用于桌面应用程序,所以我无法更改用户计算机上的访问列表。 误报肯定是下游的错误。但是,考虑到错误的独特性,我会说您可能会考虑将误报作为您的条件,并向最终用户提供有关如何将您的应用添加到列表中的说明(如果发生这种情况)。确保您在另一个捕获中处理记录的异常以处理负面情况。

以上是关于当“受控文件夹访问”打开时如何检查 .NET 中的目录写入权限的主要内容,如果未能解决你的问题,请参考以下文章

当键盘打开时,Popover 中的 UITableView 滚动出界

如何在RubyMine中打开时更改终端字体?

相机打开时如何释放相机?

当文件在另一个进程中打开时,Inno Setup LoadStringFromFile 失败

当我关闭调制解调器同时保持路由器打开时如何检测互联网连接?

如何创建一个倒数计时器,当屏幕关闭时停止并“等待”,重新打开时恢复。安卓