.Net核心中对文件安全性的支持

use*_*074 6 .net security file core

我们将.Net 4.0类库移植到.Net Core 1.1,并遇到了对.Net core CLR中文件安全性和权限的非常有限支持的问题。我们试图按如下所示设置对文件的访问控制权限,并且FileInfo似乎不再具有任何SetAccessControl或GetAccessControl。

 // Get a FileSecurity object that represents the
    // current security settings.
    FileSecurity fSecurity = File.GetAccessControl(fileName);

    // Add the FileSystemAccessRule to the security settings.
    fSecurity.AddAccessRule(new FileSystemAccessRule(account,
        rights, controlType));

    // Set the new access settings.
    File.SetAccessControl(fileName, fSecurity);
Run Code Online (Sandbox Code Playgroud)

目标只是向文件的当前所有者添加执行权,我们非常感谢您的帮助。

bvp*_*vpb 6

由于使用率低且特定于 Windows,这些 API 尚未包含在 .NET Standard 中。

请参阅此处有关其从 .NET Standard 中排除的讨论:https : //github.com/dotnet/standard/issues/15

作为一种解决方法,有一个提供此功能的 NuGet 包:https : //www.nuget.org/packages/System.IO.FileSystem.AccessControl/

还有一个相关的问题:How to modify file access control in .NET Core


Jon*_*n R 5

哇,有这么多信息,尽管文档说在 .NET Core 3.1 中你不能执行 DirectoryInfo.SetAccessRule,但它已编译并运行!

更新:啊哈!文档说这是支持的并且它可以工作。https://learn.microsoft.com/en-us/dotnet/api/system.io.filesystemaclextensions?view=dotnet-plat-ext-3.1确实有 SetAccessControl 方法

请务必添加System.IO.FileSystem.AccessControlNuGet 包。

这是我在 .NET Framework 中的内容:

var ds = new DirectorySecurity();
ds.AddAccessRule(new FileSystemAccessRule(adminSI, FileSystemRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
ds.SetAccessRuleProtection(true, false); // disable inheritance and clear any inherited permissions

Directory.SetAccessControl(<path to directory>, ds);
Run Code Online (Sandbox Code Playgroud)

以下是它在 .NET Core 3.1 中的工作原理。只有最后一行不同:

var ds = new DirectorySecurity();
ds.AddAccessRule(new FileSystemAccessRule(adminSI, FileSystemRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
ds.SetAccessRuleProtection(true, false); // disable inheritance and clear any inherited permissions

System.IO.FileSystemAclExtensions.SetAccessControl(new DirectoryInfo(<path to directory>), ds);
Run Code Online (Sandbox Code Playgroud)