Почему я не могу отредактировать файл «Program Files» в Windows 7?

25

У меня проблемы с редактированием этого файла в Windows 7:

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

Если бы я изменить его в Cygwin (VI) или TextPad, эти две программы увидеть изменения, поэтому она становится записаны на диск где - то . Но если я «наберу» файл в оболочке DOS cmd, похоже, что файл вообще не был изменен.

Одна вещь, которую я заметил, заключается в том, что в оболочке cmd владелец - это Администраторы, а в оболочке Cygwin - владелец 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

Как это может быть? Это как два разных файла с одинаковыми именами в одном каталоге.

Дэн
источник
Вы получаете какие-либо сообщения об ошибках?
ChrisF
Может ли это быть какое-то перенаправление папок WoW64 (поскольку Cygwin является 32-битным)?
Эндрю Ламберт

Ответы:

35

Благодаря функциям безопасности, представленным в Windows Vista ( UAC ), любая программа без прав администратора, которая пытается записывать в защищенные места, такие как «Program Files», будет перехватывать свои записи и перенаправлять их в альтернативное «удобное» место.

Программа, которая создала файл, сможет увидеть файл, но большинство других программ не смогут.

Википедия утверждает (и я выделил соответствующий раздел):

Приложения, написанные с допущением, что пользователь будет работать с правами администратора, испытывали проблемы в более ранних версиях Windows при запуске с ограниченными учетными записями пользователей, часто из-за того, что они пытались выполнить запись в машинные или системные каталоги (такие как Program Files) или ключи реестра. (особенно HKLM). UAC пытается облегчить это с помощью виртуализации файлов и реестра, которая перенаправляет записи (и последующие операции чтения) в расположение пользователя в профиле пользователя . Например, если приложение пытается выполнить запись в «C: \ program files \ appname \ settings.ini» и у пользователя нет прав на запись в этот каталог, запись будет перенаправлена ​​в «C: \ Users \ username». \ AppData \ Local \ VirtualStore \ Program Files \ appname \ settings.ini ”.

Таким образом, в теории ваш измененный файл фактически записывается вC:\Users\YourUserName\AppData\Local\VirtualStore\Program Files (x86)\CMake 2.8.7\share\cmake-2.8\Modules

Единственный способ обойти это ограничение - полностью отключить UAC , что не рекомендуется по соображениям безопасности.

Лучшее решение заключается в том, чтобы на вашем пути был cmake, и вы должны использовать незащищенное местоположение, например, где-то внутри вашего профиля пользователя.

Мокубай
источник
Спасибо. Очень запутанно. Как будет иметь значение cmake на моем пути (или нет), хоть какая-то разница? Проблема в том, что я пытаюсь отладить этот файл cmake, так как он не работает должным образом.
Дан
Извините, я предполагал, что вы запускаете cmake для файла. Чтобы использовать любой файл, вы должны будете написать его в другом месте, тогда вы сможете использовать Проводник для копирования файла, вы должны получить приглашение UAC с просьбой убедиться, что это именно то, что вы хотите сделать, и после этого Ваш файл должен быть перезаписан. Главное, что вы можете использовать только программы с поддержкой UAC (например, Explorer) для копирования / записи файлов в этих местах.
Мокубай
Отключение UAC - не единственное решение проблемы. Вам просто нужно дать файлу / каталогу, вызывающему проблемы, Modifyразрешения для Usersгруппы пользователей, перейдя на вкладку безопасности файла / папки.
Скотт Чемберлен
LOL это поведение странно! Это объясняет много странностей, которые у меня были. Спасибо.
Jez
13

Папка Program Files защищена правами администратора. В Windows XP и более ранних версиях большинство людей все время работали с правами администратора. Многие программы предполагали, что это так и сделали всю свою работу в папке Program Files.

Когда Windows Vista была выпущена, они прекратили эту практику, заставив приложения вместо этого использовать:

C: \ Users \% Имя пользователя% \ AppData

Это сломало много старых приложений. Чтобы старое приложение продолжало использовать только папки администратора, Windows создала виртуальное хранилище для хранения измененных файлов. Посмотрите:

C: \ Users \% Имя пользователя% \ AppData \ Local \ VirtualStore

Вы найдете свои файлы там. Вы также можете использовать Проводник, открыв папку и нажав кнопку Файлы совместимости в верхней части окна.

Hand-E-Food
источник
Спасибо. Это (и принятый ответ) решило очень загадочную проблему, с которой я столкнулся. Имеет смысл сейчас, когда это объясняется. Ваш ответ короткий и прямо к делу. +1 Спасибо!
Ridgerunner
0

У меня была похожая проблема, вскоре после перехода на Windows 7 (из XP) я пытался разархивировать файл внутри, C:\Program Filesи он продолжал выдавать мне ошибку «Отказано в доступе».

После долгой борьбы я обнаружил, что мне нужно взять на себя ответственность за всю папку, прежде чем я смог изменить разрешения, чтобы разрешить группе администраторов полный доступ, что, по моему мнению, должно быть по праву.

Чтобы стать владельцем папки: щелкните правой кнопкой мыши папку и перейдите к ней Properties, затем нажмите Securityвкладку, затем нажмите Advanced, затем Ownerвкладку и нажмите Edit. Установите флажок «Заменить владельца на подконтейнеры и объекты», затем выберите нового владельца (например, группу «Администраторы»), а затем произнесите OK.

Сэм П
источник
Тьфу, тебе не нужно брать на себя ответственность. Просто дайте Usersгруппе разрешение на изменение. Однако вам не следует предоставлять полный доступ к программным файлам. По умолчанию все, кто был администратором, были плохим выбором дизайна, и они пытались это исправить в Vista.
Скотт Чемберлен