Поддержка безопасности файлов в ядре.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

Другие вопросы по тегам