Проверьте разрешение файла в C#. NET Core - PullRequest
3 голосов
/ 16 марта 2020

Я работаю над проектом, в котором я должен выполнить проверку работоспособности файлов. Мне нужно убедиться, что текущий системный пользователь имеет доступ для чтения к файлу, и я сначала попытался сделать это с помощью:

var readPermission = new FileIOPermission(FileIOPermissionAccess.Read, filePath);

try
{
    readPermission.Demand();
}
catch (SecurityException ex)
{
    //handle the exception, which should be thrown if current user does NOT have the read permission
}

Это не сработало, например, не было сгенерировано исключение, и поэтому я попытался сделать это :

var readPermission = new FileIOPermission(FileIOPermissionAccess.Read, filePath);


if(! SecurityManager.IsGranted(readPermission))
{

    throw new SecurityException(
        String.Format("System user: {0} does not have read access to file {1}", User.Identity.Name, filePath)
        );
}

API SecurityManager, похоже, в основном устарел, так что это также кажется тупиком. Есть ли какой-то другой способ узнать, какие права доступа пользователь имеет к файлу?

1 Ответ

1 голос
/ 16 марта 2020
  • Сначала получите Список контроля доступа (ACL) записей для файла, описываемого текущим объектом FileInfo, это инкапсулировано в объект FileSecurity
  • Затем мы используем GetAccessRules, который получает набор правил, связанных с вышеупомянутым FileSecurity объектом
  • Набор правил представляет AuthorizationRule объекты, из которых FileSystemAccessRule происходит, которые вы можете запросить, чтобы понять разрешение, относящееся к файлу

Фрагмент: проверяет, имеет ли test.txt разрешение на чтение (было протестировано с использованием. Net Core)

using System;
using System.IO;
using System.Security.AccessControl;
using System.Security.Principal;
using System.Linq;

var MyPath = @"C:\Users\repos\test.txt";
var fInfo = new FileInfo(MyPath);

FileSecurity fSecurity = fInfo.GetAccessControl();

SecurityIdentifier usersSid = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null);
FileSystemRights fileRights = FileSystemRights.Read | FileSystemRights.Synchronize; //All read only file usually have Synchronize added automatically when allowing access, refer the msdn doc link below

var rules = fSecurity.GetAccessRules(true, true, usersSid.GetType()).OfType<FileSystemAccessRule>();
var hasRights = rules.Where(r => r.FileSystemRights == fileRights).Any();

Предварительное условие Nuget: System.IO.FileSystem.AccessControl

Ссылка: FileSystemRights Enums

...