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).
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. –