我们正在将.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);
目标只是将执行权添加到文件的当前所有者,我们非常感谢任何帮助。
答案 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/
答案 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)