当“受控文件夹访问”打开时如何检查 .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 滚动出界