¿Por qué no puedo editar un archivo de "Archivos de programa" en Windows 7?

25

Tengo problemas para editar este archivo en Windows 7:

C:\Program Files (x86)\CMake 2.8.7\share\cmake-2.8\Modules\FindJNI.cmake

Si lo edito en Cygwin (vi) o TextPad, esos dos programas ven los cambios, por lo que se está escribiendo en el disco en alguna parte . Pero si "escribo" el archivo en un shell de cmd de DOS, parece que el archivo no ha cambiado en absoluto.

Una cosa que noté es que en el shell cmd, el propietario es Administradores, pero en el shell bash de Cygwin, el propietario es Dan:

C:\Program Files (x86)\CMake 2.8.7\share\cmake-2.8\Modules>dir /Q FindJ*
 Volume in drive C is Windows7_OS
 Volume Serial Number is 92CA-8707

 Directory of C:\Program Files (x86)\CMake 2.8.7\share\cmake-2.8\Modules

12/30/2011  09:45 AM             1,480 BUILTIN\Administrators FindJasper.cmake
12/30/2011  09:45 AM             7,951 BUILTIN\Administrators FindJava.cmake
12/30/2011  09:45 AM            10,632 BUILTIN\Administrators FindJNI.cmake
12/30/2011  09:45 AM             1,669 BUILTIN\Administrators FindJPEG.cmake
               4 File(s)         21,732 bytes
               0 Dir(s)  132,524,654,592 bytes free


Dan@home /c/Program Files (x86)/CMake 2.8.7/share/cmake-2.8/Modules
$ ls -al FindJ*
-rwx------+ 1 Dan            None 10636 Jan 30 13:57 FindJNI.cmake
-rwx------+ 1 Administrators None  1669 Dec 30 09:45 FindJPEG.cmake
-rwx------+ 1 Administrators None  1480 Dec 30 09:45 FindJasper.cmake
-rwx------+ 1 Administrators None  7951 Dec 30 09:45 FindJava.cmake

¿Cómo puede ser esto? Es como si hubiera dos archivos diferentes con el mismo nombre en el mismo directorio.

Dan
fuente
¿Está recibiendo algún mensaje de error?
ChrisF
¿Podría ser algún tipo de redirección de carpeta WoW64 (ya que Cygwin es de 32 bits)?
Andrew Lambert

Respuestas:

35

Debido a las características de seguridad introducidas con Windows Vista ( UAC ), cualquier programa que no sea Administrador que intente escribir en ubicaciones protegidas como "Archivos de programa" obtendrá sus escrituras capturadas y redirigidas a una ubicación alternativa "amigable para el usuario".

El programa que creó el archivo podrá ver el archivo, pero la mayoría de los otros programas no.

Wikipedia dice (y he resaltado la sección correspondiente):

Las aplicaciones escritas con el supuesto de que el usuario se ejecutará con privilegios de administrador experimentaron problemas en versiones anteriores de Windows cuando se ejecutan desde cuentas de usuario limitadas, a menudo porque intentaron escribir en directorios de todo el equipo o del sistema (como Archivos de programa) o claves de registro (notablemente HKLM). UAC intenta aliviar esto mediante la virtualización de archivos y registros, que redirige las escrituras (y las lecturas posteriores) a una ubicación por usuario dentro del perfil del usuario . Por ejemplo, si una aplicación intenta escribir en “C: \ archivos de programa \ nombre de aplicación \ settings.ini” y el usuario no tiene permisos para escribir en ese directorio, la escritura será redirigida a “C: \ Users \ username \ AppData \ Local \ VirtualStore \ Program Files \ appname \ settings.ini ".

Entonces, en teoría, el archivo modificado se está escribiendo enC:\Users\YourUserName\AppData\Local\VirtualStore\Program Files (x86)\CMake 2.8.7\share\cmake-2.8\Modules

La única forma de evitar esta restricción es desactivar completamente el UAC , lo que no se recomienda por razones de seguridad.

La mejor solución es que debería tener cmake en su camino y estar usando una ubicación no protegida, como en algún lugar dentro de su perfil de usuario.

Mokubai
fuente
Gracias. Muy confuso. Sin embargo, ¿cómo podría tener alguna diferencia en mi camino (o no)? El problema es que estoy tratando de depurar este archivo cmake, ya que no funciona correctamente.
Dan
Lo siento, estaba asumiendo que estabas ejecutando cmake contra el archivo. Para usar el archivo que sea, tendrá que escribirlo en otro lugar, entonces debería poder usar el Explorador para copiar el archivo, debería recibir un aviso de UAC que le pedirá que se asegure de que esto es lo que quiere hacer y después de eso su archivo debería sobrescribirse. Lo principal es que solo puede usar programas compatibles con UAC (como Explorer) para copiar / escribir archivos en esas ubicaciones.
Mokubai
Deshabilitar UAC no es la única solución. Solo necesita otorgar Modifypermisos al archivo / directorio que está causando problemas al Usersgrupo de usuarios yendo a la pestaña de seguridad del archivo / carpeta.
Scott Chamberlain
LOL este comportamiento es extraño! Explica muchas de las rarezas que he tenido. Gracias.
Jez
13

La carpeta Archivos de programa está protegida por derechos de administrador. En Windows XP y versiones anteriores, la mayoría de las personas corrían como administrador todo el tiempo. Muchos programas asumieron que este era el caso e hicieron todo su trabajo en la carpeta Archivos de programa.

Cuando se lanzó Windows Vista, detuvieron esta práctica, obligando a las aplicaciones a usar en su lugar:

C: \ Usuarios \% Nombre de usuario% \ AppData

Esto rompió muchas aplicaciones antiguas. Para permitir que una aplicación anterior continúe usando carpetas solo de administrador, Windows creó una tienda virtual para mantener los archivos alterados. Eche un vistazo a:

C: \ Usuarios \% Nombre de usuario% \ AppData \ Local \ VirtualStore

Encontrarás tus archivos allí. También puede usar el Explorador abriendo la carpeta y presionando el botón Archivos de compatibilidad en la parte superior de la ventana.

Hand-E-Food
fuente
Gracias. Esto (y la respuesta aceptada) resolvió un problema muy misterioso que estaba teniendo. Tiene perfecto sentido ahora que se explica. Su respuesta es breve y directa al grano. +1 ¡Gracias!
ridgerunner
0

Tuve un problema similar, poco después de pasar a Windows 7 (desde XP) estaba tratando de descomprimir un archivo dentro C:\Program Filesy me seguía dando un error de acceso denegado.

Después de muchas luchas, descubrí que tenía que tomar posesión de toda la carpeta antes de poder cambiar los permisos para permitir el acceso total del grupo de administradores, lo que, en mi opinión, debería tener.

Para tomar posesión de una carpeta: haga clic derecho en la carpeta y vaya a Properties, luego haga clic en la Securitypestaña, luego haga clic Advanced, luego la Ownerpestaña y haga clic Edit. Marque "Reemplazar propietario en subcontenedores y objetos", luego seleccione el nuevo propietario (por ejemplo, el grupo "Administradores") y luego diga OK.

Sam P
fuente
Ugh, no necesitas tomar posesión. Solo dale al Usersgrupo permisos de modificación. Sin embargo debe no dará acceso completo a los archivos de programa. El valor predeterminado de que todos sean administradores era una mala elección de diseño e intentaron solucionarlo en Vista.
Scott Chamberlain