Использование C # для получения списка ACL для серверов и подключенных дисков - PullRequest
14 голосов
/ 20 февраля 2009

Разработчикам производственных изменений для нашей ИТ-группы было поручено проверить безопасность всех различных объектов в нашей группе, прежде всего, чтобы убедиться, что люди, которые ушли с работы или перешли в другие группы, больше не имеют доступа к общие ресурсы нашего сервера, веб-каталоги, базы данных sql и т. д. и т. д. Недавно мы завершили часть SQL, и у нас есть сценарий многократного использования, который можно запускать ежегодно (или с любой частотой, с которой мы придумываем). Он работал отлично, и мы провели аудит 20 баз данных на 10 или около того серверах за несколько минут.

Теперь о вещах на сервере. У меня есть приложение, которое я написал на C # с использованием .NET 2.0, которое будет рекурсивно сканировать список каталогов и выводить ACL в текстовый файл. Это работает отлично. На местной машине. UNC и Mapped paths не работают, я получаю следующее сообщение об исключении: процесс не обладает привилегией SeSecurityPrivilege, которая требуется для этой операции.

На этой строке:

DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.All);

Где di - объект DirectoryInfo, перечисляемый из массива DirectoryInfo [].

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

Есть мысли о том, как изменить этот раздел кода, чтобы получить разрешения для целевой папки?

private void CheckSecurity(DirectoryInfo[] DIArray)
{
    foreach (DirectoryInfo di in DIArray)
    {
        DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.All);
        string sAccessInfo = string.Empty;

        foreach (FileSystemAccessRule FSAR in DirSec.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)))
        {
            sAccessInfo += GetAceInformation(FSAR);
        }

        if (sAccessInfo != string.Empty)
        {
            // Write info to text file
        }
    }
}

private string GetAceInformation(FileSystemAccessRule ace)
{
    StringBuilder info = new StringBuilder();
    string line = string.Format("Account: {0}", ace.IdentityReference.Value);
    info.AppendLine(line);
    line = string.Format("Type: {0}", ace.AccessControlType);
    info.AppendLine(line);
    line = string.Format("Rights: {0}", ace.FileSystemRights);
    info.AppendLine(line);
    line = string.Format("Inherited ACE: {0}", ace.IsInherited);
    info.AppendLine(line);
    return info.ToString();
}

Edit: Как бы я проверил удаленную папку для атрибута чтения в ACL, когда он не может получить метод «GetAccessControl ()» для корневой папки? (Если я укажу \ server \ path, произойдет ошибка при получении информации для \ server \ path).

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

Я проверю монитор процесса, но я не уверен, что смогу запустить его на сервере (я не являюсь администратором рассматриваемого сервера).

Ответы [ 2 ]

20 голосов
/ 22 февраля 2009

Вы получаете сообщение об ошибке из-за вкладки «Аудит», хотя я вполне уверен, что все, что вы действительно хотите получить на экране, это данные на вкладке «Разрешения». SeSecurityPrivilege контролирует доступ к SACL.

Попробуйте изменить

DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.All);

до

DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.Access);

тогда вы должны перестать получать ошибку

1 голос
/ 20 февраля 2009

Убедитесь, что удаленная папка предоставляет пользователю, выполняющему код чтения атрибутов в ACL.

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

Наличие Process Monitor , запущенного на сервере (отфильтровано по рассматриваемым папкам / файлам), может помочь выяснить причины его сбоя.

...