2011-03-09 13 views
8

Estoy tratando de superar la siguiente situación.Tomar posesión de archivos con permisos 'rotos'

Dado un directorio almacenado en un volumen NTFS, donde:

  1. El propietario del directorio se establece en otra persona (un usuario no privilegiado por ejemplo)
  2. El directorio DACL está configurado para permitir el acceso a un grupo específico de personas que no incluye el sistema o administradores
  3. la DACL en el directorio realidad otorga a nadie el acceso a cualquiera de tomar posesión o cambiar la DACL

(o en resumen, todos los administradores se han bloqueado de la carpeta)

¡Pero!

  1. La cuenta estoy corriendo bajo tiene derechos administrativos (SeBackupPrivilege, SeSecurityPrivilege)
  2. La DACL existente puede ser ignorada ya que estoy escribiendo un nuevo uno de todos modos
  3. El uso de otras herramientas (takeown.exe), I puede obtener acceso al directorio en cuestión.

(o en fin, tengo acceso a fijar la DACL/propietario)

debería tener ningún problema con el siguiente código:

WindowsIdentity privilegedUser = System.Security.Principal.WindowsIdentity.GetCurrent(); 

// I cannot use File.GetAccessControl() as I get access denied 
// (working as intended! I have no access to read the ACL!) 
// so I have to write a new ACL: 
FileSecurity acl = new FileSecurity(); 
acl.SetOwner(admin.User); 
acl.AddAccessRule(new FileSystemAccessRule(privilegedUser.User, FileSystemRights.FullControl, AccessControlType.Allow)); 

File.SetAccessControl("c:\\path\\to\\broken", acl); 

embargo, la SetAccessControl llamada tiros UnauthorizedAccessException. Cuando lo modifico para ajustar solo al propietario, sucede lo mismo. Cuando solo trato de ajustar la DACL, lo mismo.

He verificado que el problema no es el UAC al verificar el proceso resultante en Process Explorer, y verifiqué que el grupo Administradores está configurado como "Propietario" en lugar de "Deshabilitado". I debería tener todos los derechos necesarios para hacer esto (los Operadores de Respaldo deberían ser extraños frente a los Administradores, pero lo agregué para las pruebas) - pero sigue arrojando acceso denegado.

documentación de TechNet Relevante: http://technet.microsoft.com/en-us/library/cc783530%28WS.10%29.aspx

  • "Si es el propietario de un objeto, puede conceder a cualquier usuario o grupo de seguridad de ningún permiso para ese objeto, incluyendo el permiso para tomar posesión."
  • La propiedad puede ser transferida de las siguientes maneras:
    • El propietario actual puede conceder el permiso Tomar posesión a otro usuario, lo que permite que el usuario tomar posesión en cualquier momento. El usuario debe tomar posesión para completar la transferencia. (Desafortunadamente, el propietario no puede reasignar la propiedad en esta situación)
    • Un administrador puede hacerse cargo.
    • Un usuario que tiene el derecho de usuario Restaurar archivos y directorios puede asignar la propiedad a cualquier usuario o grupo.
  • La capacidad de apropiarse de archivos y otros objetos es otro caso donde la necesidad del administrador de mantener el sistema tiene prioridad sobre el derecho del propietario a controlar el acceso. Normalmente, puede tomar posesión de un objeto solo si su propietario actual le da permiso para hacerlo. Los propietarios de objetos NTFS pueden permitir que otro usuario asuma la propiedad otorgando al otro usuario el permiso de Tomar posesión; los propietarios de los objetos de Active Directory pueden otorgar a otro usuario permiso Modificar propietario. Un usuario que tiene este privilegio puede tomar posesión de un objeto sin el permiso del propietario actual. De forma predeterminada, el privilegio se asigna solo al grupo de administradores integrado. Normalmente es utilizado por los administradores para tomar y reasignar la propiedad de los recursos cuando su propietario actual ya no está disponible.

¿Qué es lo que falta aquí?

+0

Teniendo exactamente el mismo problema. ¿Alguna vez lograste encontrar una solución a esto? – Maverik

+0

Vea también http://stackoverflow.com/questions/5368825/taking-ownership-of-a-file-or-folder y http://stackoverflow.com/questions/153087/getting-setting-file-owner-in -c-sharp –

Respuesta

6

que tenía el mismo problema y acaba de publicar aquí para cualquier otra persona que pueda venir aquí buscando como yo:

Debe habilitar explícitamente SeTakeOwnershipPrivilege en el código. Encontré Process Privileges para ser realmente útil en este tipo de cosas.

Aquí es cómo lo arreglen mi código (parece que por alguna razón a pesar de que tengo el privilegio, el proceso no menos que explícitamente permita):

using (new ProcessPrivileges.PrivilegeEnabler(Process.GetCurrentProcess(), Privilege.TakeOwnership)) 
{ 
    directoryInfo = new DirectoryInfo(path); 
    directorySecurity = directoryInfo.GetAccessControl(); 

    directorySecurity.SetOwner(WindowsIdentity.GetCurrent().User); 
    Directory.SetAccessControl(path, directorySecurity);  
} 

PD: Gracias Simon .. su la respuesta me dio un lugar para comenzar.

+0

¡Este fue de hecho mi problema! Buena ol 'UAC. Y sí, gracias Simon por el primer plato, si nada más. –

+1

Tuve este problema y ni siquiera tenía habilitado el UAC ... ¡pero funcionó! – emfurry

+1

No tiene nada que ver con UAC. Los privilegios siempre han funcionado de esta manera, mucho antes de que se introdujera el UAC; si desea usarlos, primero debe habilitarlos. (Presumiblemente para que el programador no pueda usar privilegios por error.) –

5

Debe asumir la propiedad antes de agregar el acceso.

using (var user = WindowsIdentity.GetCurrent()) 
{ 
    var ownerSecurity = new FileSecurity(); 
    ownerSecurity.SetOwner(user.User); 
    File.SetAccessControl("c:\\path\\to\\broken", ownerSecurity); 

    var accessSecurity = new FileSecurity(); 
    accessSecurity.AddAccessRule(new FileSystemAccessRule(user.User, FileSystemRights.FullControl, AccessControlType.Allow)); 
    File.SetAccessControl("c:\\path\\to\\broken", accessSecurity); 
} 

también si está configurando DirectorySecurity que necesitará esta

using (var user = WindowsIdentity.GetCurrent()) 
{ 
    var ownerSecurity = new DirectorySecurity(); 
    ownerSecurity.SetOwner(user.User); 
    Directory.SetAccessControl("c:\\path\\to\\broken", ownerSecurity); 

    var accessSecurity = new DirectorySecurity(); 
    accessSecurity.AddAccessRule(new FileSystemAccessRule(user.User, FileSystemRights.FullControl, AccessControlType.Allow)); 
    Directory.SetAccessControl("c:\\path\\to\\broken", accessSecurity); 
} 

Si eso no funciona prueba este

http://blog.mikeobrien.net/2009/11/taking-ownership-and-setting-admin.html

+0

Gracias, Simon. Estuve luchando con esto por un tiempo. Leí el artículo de Mark's MSDN, que estoy contento de haberlo hecho, pero fue tu publicación lo que salvó el día. –

+0

El código en el blog Mike O'Briens funcionó perfectamente para mí. – David

Cuestiones relacionadas