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

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

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

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

【问题讨论】:

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

标签: c# controlled-folder-access


【解决方案1】:

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

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

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

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

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

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

编辑:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

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