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)
目标只是向文件的当前所有者添加执行权,我们非常感谢您的帮助。
由于使用率低且特定于 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
哇,有这么多信息,尽管文档说在 .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)