Поддержка безопасности файлов в ядре.Net
Мы портировали библиотеку класса.Net 4.0 на.Net Core 1.1 и столкнулись с проблемой очень ограниченной поддержки безопасности файлов и разрешений в CLR ядра.Net. Мы пытались установить права доступа к файлу, как показано ниже, и кажется, что 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);
Цель состоит в том, чтобы просто добавить право выполнения к текущему владельцу файла, любая помощь будет высоко оценена.
2 ответа
Эти API не были включены в.NET Standard из-за низкого уровня использования и специфики Windows.
Смотрите обсуждение здесь относительно его исключения из.NET Standard: https://github.com/dotnet/standard/issues/15
В качестве обходного пути есть пакет NuGet, который предоставляет эту функциональность: https://www.nuget.org/packages/System.IO.FileSystem.AccessControl/
Также связанный вопрос: Как изменить контроль доступа к файлам в.NET Core
Вау, там столько информации, и хотя в документации сказано, что в.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);
В стандарте / ядре dotnet:
Импортируйте пакет NuGet как упомянутый пользователь bvpb. 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
вместо этого требуется, чтобы у учетной записи с этим кодом было больше разрешений.
Я думаю, что эта функциональность здесь сейчас: https://docs.microsoft.com/en-us/dotnet/core/api/system.security.accesscontrol