2009-02-20 14 views
12

Los implementadores de cambios de producción para nuestro grupo de TI se han encargado de revisar la seguridad de todos los objetos de nuestro grupo, principalmente para garantizar que las personas que se han ido empleamos o hemos transferido a otros grupos que ya no tienen acceso a nuestros recursos compartidos de servidor, directorios web, bases de datos sql, etc. Hemos completado recientemente la porción de SQL y tenemos un script reutilizable que se puede ejecutar anualmente (o con la frecuencia que sea se nos ocurre). Funcionó muy bien y auditamos 20 bases de datos en aproximadamente 10 servidores durante unos minutos.Utilizando C# para obtener una lista de ACL para servidores y unidades mapeadas

Ahora, para las cosas del servidor. Tengo una aplicación que escribí en C# usando .NET 2.0 que explorará de forma recursiva una lista de directorios y volcará las ACL a un archivo de texto. Esto funciona excelente En la máquina local. Las rutas UNC y 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); 

Donde di es un objeto DirectoryInfo enumerado de una matriz DirectoryInfo [].

No es probable que se nos otorgue el privilegio SeSecurityPrivilege. Sin embargo, no creo que esto deba ser necesario. Puedo abrir la carpeta y hacer clic con el botón derecho para ver las propiedades y hacer clic en la pestaña de seguridad y verla en la GUI. I debería poder acceder a él mediante programación tambié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(); 
} 

Editar: ¿Cómo iba a comprobar la carpeta remota para el attrib lectura en la ACL cuando falla en conseguir el método "GetAccessControl()" para la carpeta raíz? (Si paso en \ 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 de las propiedades de la carpeta/archivos.

Revisaré el monitor del proceso, pero no estoy seguro de que pueda ejecutarlo en el servidor (no soy administrador del servidor en cuestión).

+1

Esta muestra de pregunta/código era realmente muy útil. Utilicé este código para construir un monitor de permiso de archivo para uno de nuestros sistemas internos. –

Respuesta

17

Aparece el error debido a la pestaña 'Auditoría', aunque estoy bastante seguro de que todo lo que realmente desea acceder en la pantalla son los datos en la pestaña 'Permisos'. SeSecurityPrivilege controla el acceso a SACL.

intente cambiar

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

a

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

entonces debería dejar de recibir el error

+0

¡Duh! No sé por qué no revisé más esas otras enumeraciones. Intentaré esto mañana y veré qué obtengo. ¡Gracias! – bdwakefield

+0

Eso hizo el truco, gracias! – bdwakefield

+0

Bueno, estaba un poco preocupado ya que no pude obtener el error yo mismo ... – uzbones

1

Compruebe que la carpeta remota concede al usuario que ejecuta el código Atributos de lectura en la ACL.

Recuerde también que los permisos se resuelven en las máquinas remotas (servidores), por lo que la membresía del grupo local (Usuarios y Administradores) puede no incluir la cuenta de usuario que se ejecuta en el cliente.

Tener Process Monitor ejecutándose en el servidor (filtrado a las carpetas/archivos en cuestión) puede ayudar a resolver los detalles de por qué está fallando.

+0

Ver nota arriba en la edición. – bdwakefield

+0

Hmmm ... sin derechos de administrador, usted estará a merced de permisos impares y/o encontrará la depuración muy difícil. – Richard

Cuestiones relacionadas