2016-06-22 1 views
0

Ниже приведен код, который я написал,Как проверить, изменились ли разрешения доступа для каталога на C#?

var prevSecInfo = Directory.GetAccessControl(path); 

if (Utilities.ShowChangePermissionsWindow(path)) { 

    var currSecInfo = Directory.GetAccessControl(path);  

    if (currSecInfo != prevSecInfo) 
     Utilities.ApplyPermissionsOnSubdirectories(path); 
} 

Таким образом, в настоящее время, я получаю информацию управления доступом перед отображением окна разрешений.

Далее я показываю окно разрешений, которое на самом деле является областью Security окна свойств файла/папки. Изменения могут быть внесены в разрешениях после его открытия.

Properties window with Security tab selected

Но, в случае, если не будут внесены никакие изменения, я не хочу называть мои ApplyPermissionsOnSubdirectories() метод. Следовательно, я снова получаю информацию контроля доступа в другой переменной и сравнивая предыдущую и текущую информацию.

Но это не работает. Сравнение возвращает false, даже если никакие разрешения не изменяются.

Как проверить, изменились ли разрешения для данного пути?

ответ

1

Таким образом вы не можете сравнивать содержимое двух объектов ссылочного типа.

if (currSecInfo != prevSecInfo) всегда будет возвращать false, если только оба они не ссылаются на один и тот же объект.

К сожалению, DirectorySecurity тип также не предусматривает Equals метод overriden.

Существует изделие для StackOverflow с некоторыми готовыми решениями для сравнения разрешений:
compare windows file (or folder) permissions

+0

Благодарим за предоставленную ссылку. Я нашел это решение полезным http://stackoverflow.com/a/17047098/3511392 –

0

При работе над проблемой выше, я нашел другое решение, которое выглядит менее сложным и короче сроки кода.

DirectorySecurity securityInfoBefore = Directory.GetAccessControl(path, AccessControlSections.Access); 
string aclStrBefore = securityInfoBefore.GetSecurityDescriptorSddlForm(AccessControlSections.Access).ToString(); 

Здесь path абсолютный путь к файлу/папке.

Цель получения объекта DirectorySecurity до того, как разрешения будут изменены и получить SecurityDescriptorSddlForm в виде строки.

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

DirectorySecurity securityInfoAfter = Directory.GetAccessControl(path, AccessControlSections.Access); 
string aclStrAfter = securityInfoAfter.GetSecurityDescriptorSddlForm(AccessControlSections.Access).ToString(); 

Следующим шагом будет сравнение строк до и после.

if (aclStrBefore.Equals(aclStrAfter)) { 
    // permissions have not changed 
} else { 
    // permissions have changed 
} 

Это помогло мне до сих пор. Не стесняйтесь добавлять к моему ответу или исправлять его, если это необходимо.