Использование C# для получения списка ACL для серверов и подключенных дисков

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

Теперь что касается сервера. У меня есть приложение, написанное на C# с использованием .NET 2.0, которое будет рекурсивно сканировать список каталогов и сбрасывать ACL в текстовый файл. Это работает отлично. На локальной машине. Пути UNC и Mapped не работают, я получаю следующее сообщение об исключении: Процесс не обладает привилегией 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();
}

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

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

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


person bdwakefield    schedule 20.02.2009    source источник
comment
Этот пример вопроса/кода был действительно очень полезным. Я использовал этот код для создания монитора прав доступа к файлам для одной из наших внутренних систем.   -  person Michael Kniskern    schedule 05.03.2009


Ответы (2)


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

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

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

to

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

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

person uzbones    schedule 22.02.2009
comment
Да! Я не знаю, почему я не просматривал эти другие перечисления больше. Я попробую это завтра и посмотрю, что я получаю. Спасибо! - person bdwakefield; 23.02.2009
comment
Еще раз, я нашел ТАК вопрос и ответ очень полезным. +1 - person Michael Kniskern; 05.03.2009

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

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

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

person Richard    schedule 20.02.2009
comment
Хммм... без прав администратора вы окажетесь во власти странных разрешений и/или сочтете отладку очень сложной. - person Richard; 20.02.2009