Utilizando C # para obtener una lista de ACL para servidores y unidades asignadas

Los implementadores de cambios de producción para nuestro grupo de TI se encargaron de revisar la seguridad de todos los diversos objetos en nuestro grupo, principalmente para asegurarse de que las personas que han dejado nuestro empleo o se han transferido a otros grupos ya no tienen acceso a nuestro servidor recursos compartidos, directorios web, bases de datos SQL, etc. Recientemente completamos la parte de SQL y tenemos un script reutilizable que se puede ejecutar anualmente (o con la frecuencia que se nos ocurra). Funcionó muy bien y auditamos 20 bases de datos en aproximadamente 10 servidores en unos pocos minutos.

Ahora, para las cosas del servidor. Tengo una aplicación que escribí en C # usando .NET 2.0 que escaneará recursivamente una lista de directorios y volcará las ACL en un archivo de texto. Esto funciona excelente. En la máquina local. UNC y las rutas asignadas no funcionan, recibo el siguiente mensaje de excepción: El proceso no posee el privilegio 'SeSecurityPrivilege' que se requiere para esta operación.

En esta línea:

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

Where di es un objeto DirectoryInfo enumerado desde una matriz DirectoryInfo [].

Es probable que no podamos obtener el privilegio SeSecurityPrivilege. Sin embargo, no creo que esto sea necesario. Puedo abrir la carpeta y hacer clic derecho para propiedades y hacer clic en la pestaña de seguridad y verla en la GUI. YOdeberí también podrá acceder a él mediante programación.

Alguna idea sobre cómo puedo cambiar esta sección de código para obtener los permisos para la carpeta de destino?

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: ¿Cómo verificaría la carpeta remota para el atributo de lectura en la ACL cuando falla al obtener el método "GetAccessControl ()" para la carpeta raíz? (Si paso \ server \ path, se produce un error al obtener la información para \ server \ path).

La cuenta de usuario es una cuenta de dominio y tengo permisos para leer la estructura del archivo. Puedo ver la seguridad desde las propiedades de la carpeta / archivos.

Revisaré el monitor de proceso, pero no estoy seguro de poder ejecutarlo en el servidor (no soy administrador en el servidor o servidores en cuestión).

Respuestas a la pregunta(2)

Su respuesta a la pregunta