File.SetAccessControl(String, FileSecurity) Метод

Определение

Применяет записи списка управления доступом (ACL), описанные объектом FileSecurity, к заданному файлу.

public:
 static void SetAccessControl(System::String ^ path, System::Security::AccessControl::FileSecurity ^ fileSecurity);
public static void SetAccessControl (string path, System.Security.AccessControl.FileSecurity fileSecurity);
static member SetAccessControl : string * System.Security.AccessControl.FileSecurity -> unit
Public Shared Sub SetAccessControl (path As String, fileSecurity As FileSecurity)

Параметры

path
String

Файл, в который нужно добавить или из которого нужно удалить записи списка управления доступом.

fileSecurity
FileSecurity

Объект FileSecurity, характеризующий запись ACL, которую необходимо применить к файлу, описанному параметром path.

Исключения

При открытии файла произошла ошибка ввода-вывода.

Параметр path имеет значение null.

Не удалось найти файл.

Параметр path указывает файл, доступный только для чтения.

-или-

Эта операция не поддерживается на текущей платформе.

-или-

Параметр path указывает каталог.

-или-

У вызывающего объекта отсутствует необходимое разрешение.

Параметр fileSecurity имеет значение null.

Примеры

В следующем примере кода используются GetAccessControl методы и SetAccessControl для добавления и удаления записи списка управления доступом (ACL) из файла. Для выполнения этого примера необходимо указать допустимую учетную запись пользователя или группы.

using namespace System;
using namespace System::IO;
using namespace System::Security::AccessControl;

// Adds an ACL entry on the specified file for the specified account.

void AddFileSecurity(String^ fileName, String^ account, 
                        FileSystemRights rights, AccessControlType controlType)
{
    // Get a FileSecurity object that represents the 
    // current security settings.
    FileSecurity^ fSecurity = File::GetAccessControl(fileName);

    // Add the FileSystemAccessRule to the security settings. 
    fSecurity->AddAccessRule(gcnew FileSystemAccessRule
                                   (account,rights, controlType));

    // Set the new access settings.
    File::SetAccessControl(fileName, fSecurity);
}

// Removes an ACL entry on the specified file for the specified account.

void RemoveFileSecurity(String^ fileName, String^ account, 
                        FileSystemRights rights, AccessControlType controlType)
{

    // Get a FileSecurity object that represents the 
    // current security settings.
    FileSecurity^ fSecurity = File::GetAccessControl(fileName);

    // Remove the FileSystemAccessRule from the security settings. 
    fSecurity->RemoveAccessRule(gcnew FileSystemAccessRule
                                      (account,rights, controlType));

    // Set the new access settings.
    File::SetAccessControl(fileName, fSecurity);
}

int main()
{
    try
    {
        String^ fileName = "test.xml";

        Console::WriteLine("Adding access control entry for " + fileName);

        // Add the access control entry to the file.
        AddFileSecurity(fileName, "MYDOMAIN\\MyAccount", 
            FileSystemRights::ReadData, AccessControlType::Allow);

        Console::WriteLine("Removing access control entry from " + fileName);

        // Remove the access control entry from the file.
        RemoveFileSecurity(fileName, "MYDOMAIN\\MyAccount", 
            FileSystemRights::ReadData, AccessControlType::Allow);

        Console::WriteLine("Done.");
    }
    catch (Exception^ ex)
    {
        Console::WriteLine(ex->Message);
    }
}
using System;
using System.IO;
using System.Security.AccessControl;

namespace FileSystemExample
{
    class FileExample
    {
        public static void Main()
        {
            try
            {
                string fileName = "test.xml";

                Console.WriteLine("Adding access control entry for "
                    + fileName);

                // Add the access control entry to the file.
                AddFileSecurity(fileName, @"DomainName\AccountName",
                    FileSystemRights.ReadData, AccessControlType.Allow);

                Console.WriteLine("Removing access control entry from "
                    + fileName);

                // Remove the access control entry from the file.
                RemoveFileSecurity(fileName, @"DomainName\AccountName",
                    FileSystemRights.ReadData, AccessControlType.Allow);

                Console.WriteLine("Done.");
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }

        // Adds an ACL entry on the specified file for the specified account.
        public static void AddFileSecurity(string fileName, string account,
            FileSystemRights rights, AccessControlType controlType)
        {

            // 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);
        }

        // Removes an ACL entry on the specified file for the specified account.
        public static void RemoveFileSecurity(string fileName, string account,
            FileSystemRights rights, AccessControlType controlType)
        {

            // Get a FileSecurity object that represents the
            // current security settings.
            FileSecurity fSecurity = File.GetAccessControl(fileName);

            // Remove the FileSystemAccessRule from the security settings.
            fSecurity.RemoveAccessRule(new FileSystemAccessRule(account,
                rights, controlType));

            // Set the new access settings.
            File.SetAccessControl(fileName, fSecurity);
        }
    }
}
open System.IO
open System.Security.AccessControl

// Adds an ACL entry on the specified file for the specified account.
let addFileSecurity fileName (account: string) rights controlType =
    // Get a FileSecurity object that represents the
    // current security settings.
    let fSecurity = File.GetAccessControl fileName

    // Add the FileSystemAccessRule to the security settings.
    FileSystemAccessRule(account, rights, controlType)
    |> fSecurity.AddAccessRule

    // Set the new access settings.
    File.SetAccessControl(fileName, fSecurity)

// Removes an ACL entry on the specified file for the specified account.
let removeFileSecurity fileName (account: string) rights controlType =
    // Get a FileSecurity object that represents the
    // current security settings.
    let fSecurity = File.GetAccessControl fileName

    // Remove the FileSystemAccessRule from the security settings.
    fSecurity.RemoveAccessRule(FileSystemAccessRule(account, rights, controlType))
    |> ignore

    // Set the new access settings.
    File.SetAccessControl(fileName, fSecurity)

let fileName = "test.xml"

printfn $"Adding access control entry for {fileName}"

// Add the access control entry to the file.
addFileSecurity fileName @"DomainName\AccountName" FileSystemRights.ReadData AccessControlType.Allow

printfn $"Removing access control entry from {fileName}"

// Remove the access control entry from the file.
removeFileSecurity fileName @"DomainName\AccountName" FileSystemRights.ReadData AccessControlType.Allow

printfn "Done."
Imports System.IO
Imports System.Security.AccessControl



Module FileExample

    Sub Main()
        Try
            Dim fileName As String = "test.xml"

            Console.WriteLine("Adding access control entry for " & fileName)

            ' Add the access control entry to the file.
            AddFileSecurity(fileName, "DomainName\AccountName", _
                FileSystemRights.ReadData, AccessControlType.Allow)

            Console.WriteLine("Removing access control entry from " & fileName)

            ' Remove the access control entry from the file.
            RemoveFileSecurity(fileName, "DomainName\AccountName", _
                FileSystemRights.ReadData, AccessControlType.Allow)

            Console.WriteLine("Done.")
        Catch e As Exception
            Console.WriteLine(e)
        End Try

    End Sub


    ' Adds an ACL entry on the specified file for the specified account.
    Sub AddFileSecurity(ByVal fileName As String, ByVal account As String, _
        ByVal rights As FileSystemRights, ByVal controlType As AccessControlType)
  
        ' Get a FileSecurity object that represents the 
        ' current security settings.
        Dim fSecurity As FileSecurity = File.GetAccessControl(fileName)

        ' Add the FileSystemAccessRule to the security settings. 
        Dim accessRule As FileSystemAccessRule = _
            New FileSystemAccessRule(account, rights, controlType)

        fSecurity.AddAccessRule(accessRule)

        ' Set the new access settings.
        File.SetAccessControl(fileName, fSecurity)

    End Sub


    ' Removes an ACL entry on the specified file for the specified account.
    Sub RemoveFileSecurity(ByVal fileName As String, ByVal account As String, _
        ByVal rights As FileSystemRights, ByVal controlType As AccessControlType)

        ' Get a FileSecurity object that represents the 
        ' current security settings.
        Dim fSecurity As FileSecurity = File.GetAccessControl(fileName)

        ' Remove the FileSystemAccessRule from the security settings. 
        fSecurity.RemoveAccessRule(New FileSystemAccessRule(account, _
            rights, controlType))

        ' Set the new access settings.
        File.SetAccessControl(fileName, fSecurity)

    End Sub
End Module

Комментарии

Метод SetAccessControl применяет записи списка управления доступом (ACL) к файлу, который представляет список ненаследованного списка ACL.

Внимание!

Список ACL, указанный fileSecurity для параметра , заменяет существующий список ACL для файла. Чтобы добавить разрешения для нового пользователя, используйте GetAccessControl метод , чтобы получить существующий список управления доступом, изменить его, а затем SetAccessControl применить его обратно к файлу.

ACL описывает отдельных пользователей и (или) группы, которые имеют или не имеют прав на определенные действия с данным файлом. Дополнительные сведения см. в разделе Практическое руководство. Добавление или удаление записей списка управления доступом.

Метод SetAccessControl сохраняет только FileSecurity объекты, которые были изменены после создания объекта. FileSecurity Если объект не был изменен, он не будет сохранен в файле. Таким образом, невозможно получить FileSecurity объект из одного файла и повторно применить тот же объект к другому файлу.

Чтобы скопировать данные ACL из одного файла в другой, выполните следующие действия.

  1. Используйте метод , GetAccessControl чтобы получить FileSecurity объект из исходного файла.

  2. Create новый FileSecurity объект для целевого файла.

  3. GetSecurityDescriptorBinaryForm Используйте метод или GetSecurityDescriptorSddlForm исходного FileSecurity объекта для получения сведений об ACL.

  4. SetSecurityDescriptorBinaryForm Используйте метод или SetSecurityDescriptorSddlForm для копирования сведений, полученных на шаге 3, в целевой FileSecurity объект.

  5. Присвойте целевому FileSecurity объекту целевой файл с помощью SetAccessControl метода .

В средах NTFS и ReadExtendedAttributes предоставляются пользователю, ReadAttributes если у пользователя есть ListDirectory права на родительскую папку. Чтобы запретить ReadAttributes и ReadExtendedAttributes, запретить ListDirectory в родительском каталоге.

Применяется к

См. также раздел