【问题标题】:Checking if a directory has read and write permissions using .Net Core使用 .Net Core 检查目录是否具有读写权限
【发布时间】:2019-12-18 21:36:11
【问题描述】:

我正在尝试使用 .Net Core 检查目录是否具有读写权限。

我正在使用 Visual Studio 2019、.Net Core 2.1。我试过GetAccessControl但没有成功,所以尝试了以下方法。

public static bool DirectoryHasPermission(string DirectoryPath)
{
    if (string.IsNullOrEmpty(DirectoryPath))
    {
        return false;
    }

    FileIOPermission f2 = new FileIOPermission(FileIOPermissionAccess.Read, DirectoryPath);
    f2.AddPathList(FileIOPermissionAccess.Write | FileIOPermissionAccess.Read, "C:\\example\\out.txt");

    try
    {
        f2.Demand();
    }
    catch (SecurityException s)
    {
        Console.WriteLine(s.Message);
        return false;
    }

    return true;
}

不管我放什么目录路径,即使不存在也返回true。

【问题讨论】:

  • @Esko 这适用于 .NET 2.0,而不是 .NET Core 2.1。旧方法在 .NET Core 中不起作用(直到 3.0)。
  • .NET 中的相关类是FileSecurity,而不是 FileIOPermission。 Luaan 已经解释过 System.Security.AccessControl 是通过仅限 Windows 的 System.IO.FileSystem.AccessControl 包添加的。 FileSecurity 的文档页面显示了它的使用方式。您可以通过FileInfo.GetAccessControl访问文件的权限
  • @Luaan 好的,很高兴知道。我认为在将该包添加到项目后,代码示例仍然适用?
  • @Kev 您在寻找 Windows 还是 Linux 权限?安全模型非常不同,需要具有不同 API 的不同包

标签: c# .net-core


【解决方案1】:

FileIOPermission 是 .NET 代码安全性的一部分 - 它旨在允许您托管权限低于主机进程的 .NET 代码(即软件进程隔离)。它与文件系统的访问权限无关。

对于 .NET Core,您可以使用 System.IO.FileSystem.AccessControl 包读取和修改对文件的访问控制。添加包后,您可以执行以下操作:

using System.IO;

public void Main(string[] args)
{
  var ac = new FileInfo(@"C:\Test.txt").GetAccessControl();

  // ac has the ACL for the file
}

不用说,这是特定于 Windows 的。

【讨论】:

  • 我尝试使用 System.IO.FileSystem.AccessControl。我通过 NuGet 添加了 System.IO.FileSystem,但是在使用 System.IO.FileSystem 添加时它不允许我使用它。没认出来!我对 .Net Core 很陌生
  • @Kev 扩展方法在System.IO;只需添加System.IO.FileSystem.AccessControl NuGet 包,然后添加using System.IO;FileInfo 应该又多了一个GetAccessControl 方法。
  • 按你说的做了。添加了 System.IO.FileSystem.AccessControl 并写了 FileInfo fileInfo = FileInfo.GetAccessControl(DirectoryPath),但仍然不喜欢 GetAccessControl。
  • @Kev 不是静态方法,需要提供FileInfo的实例,例如new FileInfo(@"C:\Test.txt").GetAccessControl();.
  • GetAccessControl 在 .Net 标准 2.0 或 .Net 5 中不可用
猜你喜欢
  • 2015-09-04
  • 2016-04-23
  • 1970-01-01
  • 2021-09-11
  • 2017-05-26
  • 2010-11-19
  • 2015-05-28
  • 1970-01-01
相关资源
最近更新 更多