Копирование разрешений каталога с C # - PullRequest
1 голос
/ 27 сентября 2019

Мне нужно скопировать разрешения безопасности из одной папки в кучу папок.

Мне нужно изменить разрешение на большое количество подпапок.Я хотел бы скопировать разрешения из существующей папки, которая имеет правильные настройки безопасности.Код работает без ошибок, но ничего не меняется.Если я создаю копию существующей папки, разрешения в порядке.

DirectorySecurity permissions = Directory.GetAccessControl(srcFolder);

foreach (var subfolder in Directory.GetDirectories(containingFolder, "*", SearchOption.TopDirectoryOnly))
{             
    Directory.SetAccessControl(subfolder, permissions);  // no change
    Directory.CreateDirectory(subfolder + "_copy", permissions); // new folder has permissions as expected                          
}

Я ожидаю, что все subfolder в containingFolder будут иметь те же разрешения, что и srcFolder.

.

1 Ответ

0 голосов
/ 29 сентября 2019

Синатр предоставил следующую ссылку, которая описывает, почему ваш код не работает и как это исправить.Я заметил, что ссылка ссылается на верхнюю часть страницы, а не на раздел замечаний.Это раздел, который содержит необходимую вам информацию.Ниже приведена правильная ссылка.

Метод Directory.SetAccessControl Примечания

Для будущих читателей я приведу здесь краткое изложение состояния документации и приведу небольшой пример кода.

Первая проблема

Вы не можете напрямую использовать объект DirectorySecutrity из одного файла / папки и применять его к другому файлу / папке, используя только GetAccessControl / SetAccessControl.

От Microsoft:

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

Теперь решение

Вотшаги, описанные Microsoft, которые позволят вам скопировать информацию о безопасности из одного файла или папки в другой.Обратите внимание, что комментарии взяты из документации, код - из моей тестовой программы.

using System.Security.AccessControl;
using System.IO;
. . . . 

string srcFolder = @"d:\srcFolder", desFolder = @"d:\desFolder";
byte[] securityDescriptor = null;


// Step 1: Use the GetAccessControl method to retrieve the
// DirectorySecurity object from the source file.
DirectorySecurity srcPermissions = Directory.GetAccessControl(srcFolder);

// Step 2: Create a new DirectorySecurity object for the destination file.
DirectorySecurity desPermissions = new DirectorySecurity();


// Step 3: Use the GetSecurityDescriptorBinaryForm method of the
// source DirectorySecurity object to retrieve the ACL information.
securityDescriptor = srcPermissions.GetSecurityDescriptorBinaryForm();

// Step 4: Use the SetSecurityDescriptorBinaryForm method to copy the
// information retrieved in step 3 to the destination
// DirectorySecurity object.
desPermissions.SetSecurityDescriptorBinaryForm(securityDescriptor);

// Step 5: Set the destination DirectorySecurity object to the
// destination file using the SetAccessControl method.
Directory.SetAccessControl(desFolder, desPermissions);

Чтобы проверить это, я создаю две папки.Один называется srcFolder, а другой - desFolder.В desFolder я удаляю все разрешения, кроме моей учетной записи.Обратите внимание, что должна присутствовать хотя бы одна учетная запись группы или пользователя, которая предоставляет доступ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...