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

时间:2017-01-11 07:22:20

标签: .net file security core

我们正在将.Net 4.0类库移植到.Net Core 1.1,并且在.Net核心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);

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

4 个答案:

答案 0 :(得分:3)

由于使用率低且特定于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

答案 1 :(得分:2)

在dotnet标准/核心中:

以提到的用户bvpb导入NuGet软件包。 System.IO.FileSystem.AccessControl

然后代替它(仅在.NET Framework中起作用):

FileSecurity fSecurity = File.GetAccessControl(fileName);

使用此功能(适用于所有.NET版本)

FileSecurity fSecurity = new FileSecurity(fileName, AccessControlSections.Owner | 
                AccessControlSections.Group |
                AccessControlSections.Access);

您可能需要使用AccessControllSections.All来代替,这要求运行此代码的帐户具有更多权限。

答案 2 :(得分:2)

哇,有那么多信息,即使文档说在.NET Core 3.1中您不能执行DirectoryInfo.SetAccessRule,它仍然可以编译和工作!

更新:哈哈!该文档说此功能受支持并且可以正常工作。 https://docs.microsoft.com/en-us/dotnet/api/system.io.filesystemaclextensions?view=dotnet-plat-ext-3.1是否具有SetAccessControl方法

请确保添加System.IO.FileSystem.AccessControl NuGet程序包。

这是我在.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);

这是.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);

答案 3 :(得分:0)