Pourquoi ne puis-je pas modifier un fichier «Program Files» sous Windows 7?

25

J'ai du mal à modifier ce fichier sous Windows 7:

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

Si je le modifie dans Cygwin (vi) ou TextPad, ces deux programmes voient les changements, donc il est écrit quelque part sur le disque . Mais si je "tape" le fichier dans un shell cmd DOS, il semble que le fichier n'a pas été modifié du tout.

Une chose que j'ai remarquée est que dans le shell cmd, le propriétaire est Administrateurs, mais dans le shell bash de Cygwin, le propriétaire est 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

Comment se peut-il? C'est comme s'il y avait deux fichiers différents portant le même nom dans le même répertoire.

Dan
la source
Recevez-vous des messages d'erreur?
ChrisF
Serait-ce une sorte de redirection de dossier WoW64 (puisque Cygwin est 32 bits)?
Andrew Lambert

Réponses:

35

En raison des fonctionnalités de sécurité introduites avec Windows Vista ( UAC ), tout programme non administrateur qui essaie d'écrire dans des emplacements protégés tels que «Program Files» verra ses écritures interceptées et redirigées vers un autre emplacement «convivial».

Le programme qui a créé le fichier pourra voir le fichier, mais la plupart des autres programmes ne le verront pas.

Wikipédia déclare (et j'ai mis en évidence la section pertinente):

Les applications écrites avec l'hypothèse que l'utilisateur s'exécutera avec des privilèges d'administrateur ont rencontré des problèmes dans les versions antérieures de Windows lorsqu'elles étaient exécutées à partir de comptes d'utilisateurs limités, souvent parce qu'elles tentaient d'écrire dans des répertoires système ou à l'échelle de la machine (tels que Program Files) ou des clés de registre (notamment HKLM). UAC tente de remédier à cela à l'aide de la virtualisation de fichiers et de registres, qui redirige les écritures (et les lectures suivantes) vers un emplacement par utilisateur dans le profil de l'utilisateur . Par exemple, si une application tente d'écrire dans «C: \ program files \ appname \ settings.ini» et que l'utilisateur n'a pas l'autorisation d'écrire dans ce répertoire, l'écriture sera redirigée vers «C: \ Users \ username \ AppData \ Local \ VirtualStore \ Program Files \ appname \ settings.ini ”.

Donc, en théorie, votre fichier modifié est en fait écrit dansC:\Users\YourUserName\AppData\Local\VirtualStore\Program Files (x86)\CMake 2.8.7\share\cmake-2.8\Modules

Le seul moyen de contourner cette restriction est de désactiver complètement l' UAC , ce qui n'est pas recommandé pour des raisons de sécurité.

La meilleure solution est que cmake devrait en fait se trouver sur votre chemin et utiliser un emplacement non protégé tel que quelque part dans votre profil utilisateur.

Mokubai
la source
Merci. Très perturbant. En quoi le fait d'avoir cmake sur mon chemin (ou non) ferait-il une différence? Le problème est que j'essaie de déboguer ce fichier cmake, car il ne fonctionne pas correctement.
Dan
Désolé, je supposais que vous exécutiez cmake sur le fichier. Afin d'utiliser le fichier, vous devrez l'écrire ailleurs, vous devriez pouvoir utiliser l'Explorateur pour copier le fichier, vous devriez obtenir une invite UAC vous demandant de vous assurer que c'est ce que vous voulez faire et après cela votre fichier devrait être écrasé. L'essentiel est que vous ne pouvez utiliser que des programmes compatibles UAC (comme Explorer) pour copier / écrire des fichiers dans ces emplacements.
Mokubai
La désactivation de l'UAC n'est pas la seule solution. Il vous suffit de donner au fichier / répertoire qui cause des problèmes des Modifyautorisations au Usersgroupe d'utilisateurs en allant dans l'onglet sécurité du fichier / dossier.
Scott Chamberlain
LOL ce comportement est bizarre! Cela explique en grande partie l'étrangeté que j'ai eue. Merci.
Jez
13

Le dossier Program Files est protégé par des droits d'administrateur. Sous Windows XP et versions antérieures, la plupart des utilisateurs s'exécutaient en permanence en tant qu'administrateur. De nombreux programmes ont supposé que c'était le cas et ont fait tout leur travail dans le dossier Program Files.

Lorsque Windows Vista a été publié, ils ont arrêté cette pratique, forçant les applications à utiliser à la place:

C: \ Users \% Username% \ AppData

Cela a cassé beaucoup d'applications plus anciennes. Pour permettre aux anciennes applications de continuer à utiliser uniquement les dossiers Administrateur, Windows a créé un magasin virtuel pour conserver les fichiers modifiés. Consultez:

C: \ Users \% Username% \ AppData \ Local \ VirtualStore

Vous y trouverez vos fichiers. Vous pouvez également utiliser l'Explorateur en ouvrant le dossier et en appuyant sur le bouton Fichiers de compatibilité en haut de la fenêtre.

Hand-E-Food
la source
Merci. Cela (et la réponse acceptée) a résolu un problème très mystérieux que j'avais. Est parfaitement logique maintenant que cela est expliqué. Votre réponse est courte et directe. +1 Merci!
ridgerunner
0

J'ai eu un problème similaire, peu de temps après le passage à Windows 7 (à partir de XP), j'essayais de décompresser un fichier à l'intérieur C:\Program Fileset cela me donnait toujours une erreur d'accès refusé.

Après beaucoup de lutte, j'ai constaté que je devais prendre possession de l'intégralité du dossier avant de pouvoir modifier les autorisations pour autoriser le groupe Administrateurs à un accès complet - ce qui, à mon avis, devrait à juste titre.

Pour vous approprier un dossier: faites un clic droit sur le dossier et allez dans Properties, puis cliquez sur l' Securityonglet, puis cliquez sur Advanced, puis sur l' Owneronglet, et cliquez sur Edit. Cochez "Remplacer le propriétaire des sous-conteneurs et des objets", puis sélectionnez le nouveau propriétaire (par exemple, le groupe "Administrateurs"), puis dites OK.

Sam P
la source
Ugh, vous n'avez pas besoin de vous approprier. Donnez simplement au Usersgroupe des autorisations de modification. Cependant, vous ne devriez pas avoir un accès complet aux fichiers du programme. La valeur par défaut de tous les administrateurs est un mauvais choix de conception et ils ont tenté de le corriger dans Vista.
Scott Chamberlain