c# - ver - ejemplos de acl
Usando C#para obtener una lista de ACL para servidores y unidades mapeadas (2)
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 han dejado nuestro empleo o se hayan transferido a otros grupos ya no tengan acceso a nuestros servidores compartidos. , 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 se nos ocurra). Funcionó muy bien y auditamos 20 bases de datos en aproximadamente 10 servidores durante unos minutos.
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. Debería poder acceder a ella programáticamente 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 verificaría la carpeta remota para leer attrib en la ACL cuando falla al obtener 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).
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 detalles de por qué está fallando.
Recibes el error debido a la pestaña ''Auditoría'', aunque estoy bastante seguro de que todo lo que realmente deseas es acceder a la pantalla en la pestaña ''Permisos''. SeSecurityPrivilege controla el acceso a SACL.
Intenta cambiar
DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.All);
a
DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.Access);
entonces deberías dejar de obtener el error