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

StackOverflow https://stackoverflow.com/questions/570042

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

к

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

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

Другие советы

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

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

Имея Процесс -монитор Запуск на сервере (отфильтрован в папки/файлы) может помочь разрешить подробную информацию о том, почему он не работает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top