2011-03-20 17 views
7

Antes de sacar el resto de mi cabello me gustaría obtener alguna información sobre esto.
Estoy tratando de tomar posesión de una carpeta. Estoy ejecutando el programa como administrador, por supuesto, y tengo derechos para tomar posesión ya que puedo cambiar el propietario en el explorador.Tomar posesión de un archivo o carpeta

Sin embargo, puedo cambiar el propietario si el administrador o mi cuenta es el propietario, y puedo cambiar los permisos si ya tengo la propiedad.
Si intento darme la propiedad de un archivo, digamos que es propiedad de SYSTEM, entonces obtengo una excepción no autorizada.

He intentado algunas cosas diferentes con los métodos de control de acceso pero nada funciona, este último método creo que es directamente por el libro.

 private static void makePerm(string file, NTAccount account) 
    { 
     FileInfo finfo = new FileInfo(file); 
     FileSecurity fsecurity = finfo.GetAccessControl(); 
     //also tried it like this //fsecurity.ResetAccessRule(new FileSystemAccessRule(string.Format(@"{0}\{1}", Environment.UserDomainName.ToString(), Environment.UserDomainName.ToString()), FileSystemRights.FullControl, AccessControlType.Allow)); 
     fsecurity.SetOwner(account); 
     finfo.SetAccessControl(fsecurity); 
    } 

Estoy intentando esto en Windows 7 por cierto.
¿Qué me falta aquí?

+0

Lo que parece que falta es que el sistema de administración y se supera. –

+0

¿Está seguro de que puede tomar posesión de Explorer en un archivo propiedad del sistema? Pareces decir eso pero demasiado explícito. –

+0

Sí, lo sé, pero ¿por qué puedo cambiar el propietario del sistema a administrador en el explorador, pero no con el código? El administrador de AFAIK siempre puede hacerse cargo de cualquier cosa. –

Respuesta

1

¿Primero elevó su proceso a través de UAC? En Windows 7, sin escalamiento de UAC, su proceso se está ejecutando con el token con privilegios inferior.

+0

Sí. Estoy ejecutando Visual Studio con privilegios elevados y he intentado ejecutar manualmente el exe como administrador. –

+1

Es posible que también deba habilitar explícitamente SeTakeOwnershipPrivilege. – Luke

8

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

Necesita habilitar explícitamente SeTakeOwnershipPrivilege en código como Lucas menciona anteriormente. Encontré este Process Privileges para ser realmente útil para tratar este tipo de cosas.

Aquí es cómo lo arreglen mi código:

using System; 
using System.Diagnostics; 

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

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

Sé que es un poco viejo, pero estaba enfrentando el mismo problema. Gracias por compartir la solución, funcionó perfectamente para mí con una adaptación. En caso de que alguien quiera hacer que otra persona sea el propietario: también necesitará el privilegio Privilege.Restore. Antes de que pueda cambiar el propietario. Y si desea apropiarse de la propiedad, primero debe crear un nuevo objeto FileSecurity, asumir la propiedad y continuar desde allí: 'var fileSecurity = new FileSecurity();' 'fileSecurity.SetOwner (_owner); ' ' File.SetAccessControl (file, fileSecurity); ' – philip

+0

@philip gracias por compartir la actualización y me alegro de poder ayudar. – Maverik

Cuestiones relacionadas