Dlaczego nie mogę edytować pliku „Program Files” w systemie Windows 7?

25

Mam problem z edycją tego pliku w systemie Windows 7:

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

Jeśli edytuję go w Cygwin (vi) lub TextPad, te dwa programy widzą zmiany, więc zapisują się gdzieś na dysku . Ale jeśli „wpisuję” plik w powłoce cmd DOS, wygląda na to, że plik w ogóle nie został zmieniony.

Zauważyłem tylko, że w powłoce cmd właścicielem są Administratorzy, ale w powłoce bash Cygwina właścicielem jest 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

Jak to może być? To tak, jakby w tym samym katalogu były dwa różne pliki o tej samej nazwie.

Dan
źródło
Czy otrzymujesz jakieś komunikaty o błędach?
ChrisF
Czy może to być przekierowanie folderu WoW64 (ponieważ Cygwin jest 32-bitowy)?
Andrew Lambert

Odpowiedzi:

35

Ze względu na funkcje bezpieczeństwa wprowadzone w systemie Windows Vista ( UAC ) każdy program niebędący administratorem, który próbuje zapisywać w chronionych lokalizacjach, takich jak „Pliki programów”, zostanie przechwycony i przekierowany do alternatywnej lokalizacji „przyjaznej dla użytkownika”.

Program, który utworzył plik, będzie mógł go zobaczyć, ale większość innych programów tego nie zrobi.

Wikipedia stwierdza (i zaznaczyłem odpowiednią sekcję):

Aplikacje napisane przy założeniu, że użytkownik będzie działał z uprawnieniami administratora, napotykały problemy we wcześniejszych wersjach systemu Windows, gdy były uruchamiane z ograniczonych kont użytkowników, często dlatego, że próbowały pisać do katalogów całego komputera lub systemowych (takich jak Pliki Programów) lub kluczy rejestru (zwłaszcza HKLM). Kontrola konta użytkownika próbuje to złagodzić za pomocą wirtualizacji plików i rejestru, która przekierowuje zapisy (i kolejne odczyty) do lokalizacji użytkownika w profilu użytkownika . Na przykład, jeśli aplikacja próbuje zapisać do „C: \ program files \ appname \ settings.ini”, a użytkownik nie ma uprawnień do zapisu w tym katalogu, zapis zostanie przekierowany do „C: \ Users \ nazwa użytkownika \ AppData \ Local \ VirtualStore \ Program Files \ appname \ settings.ini ”.

Więc teoretycznie twój zmieniony plik jest w rzeczywistości zapisywanyC:\Users\YourUserName\AppData\Local\VirtualStore\Program Files (x86)\CMake 2.8.7\share\cmake-2.8\Modules

Jedynym sposobem obejścia tego ograniczenia jest całkowite wyłączenie UAC , co nie jest zalecane ze względów bezpieczeństwa.

Najlepszym rozwiązaniem jest posiadanie cmake na twojej ścieżce i używanie niezabezpieczonej lokalizacji, takiej jak gdzieś w twoim profilu użytkownika.

Mokubai
źródło
Dzięki. Bardzo mylące. W jaki sposób posiadanie cmake na mojej ścieżce (lub nie) miałoby jakąkolwiek różnicę? Problem polega na tym, że próbuję debugować ten plik cmake, ponieważ nie działa on poprawnie.
Dan
Przepraszamy, zakładałem, że uruchamiasz cmake przeciwko plikowi. Aby użyć dowolnego pliku, musisz go zapisać w innym miejscu, a następnie powinieneś móc użyć Eksploratora do skopiowania pliku, powinieneś otrzymać monit UAC z prośbą o upewnienie się, że to właśnie chcesz zrobić, a następnie twój plik powinien zostać nadpisany. Najważniejsze jest to, że możesz używać programów obsługujących UAC (takich jak Explorer) do kopiowania / zapisywania plików w tych lokalizacjach.
Mokubai
Wyłączenie UAC nie jest jedynym rozwiązaniem . Musisz tylko nadać plikowi / katalogowi, który powoduje problemy, Modifyuprawnienia Usersgrupie użytkowników, przechodząc do zakładki bezpieczeństwa pliku / folderu.
Scott Chamberlain,
LOL to zachowanie jest dziwne! To wyjaśnia wiele dziwności, które miałem. Dzięki.
Jez
13

Folder Program Files jest chroniony prawami administratora. W systemie Windows XP i wcześniejszych większość osób cały czas działała jako administrator. Wiele programów zakładało, że tak jest, i całą swoją pracę wykonało w folderze Program Files.

Po wydaniu systemu Windows Vista zaprzestano tej praktyki, zmuszając aplikacje do korzystania z:

C: \ Users \% Nazwa użytkownika% \ AppData

To zepsuło wiele starszych aplikacji. Aby starsza aplikacja mogła nadal korzystać z folderów tylko dla administratora, system Windows utworzył sklep wirtualny, w którym przechowywane są zmienione pliki. Spójrz:

C: \ Users \% Nazwa użytkownika% \ AppData \ Local \ VirtualStore

Znajdziesz tam swoje pliki. Możesz także użyć Eksploratora, otwierając folder i naciskając przycisk Pliki kompatybilności w górnej części okna.

Hand-E-Food
źródło
Dzięki. To (i zaakceptowana odpowiedź) rozwiązało bardzo tajemniczy problem, który miałem. Ma teraz pełny sens, gdy jest wyjaśniony. Twoja odpowiedź jest krótka i bezpośrednio do rzeczy. +1 dzięki!
ridgerunner
0

Miałem podobny problem, wkrótce po przejściu do systemu Windows 7 (z XP) próbowałem rozpakować plik wewnątrz C:\Program Filesi ciągle pojawiał się błąd odmowy dostępu.

Po wielu zmaganiach odkryłem, że musiałem przejąć na własność cały folder, zanim mogłem zmienić uprawnienia, aby umożliwić grupie administratorów pełny dostęp - co moim zdaniem powinno to mieć.

Aby przejąć własność folderu: kliknij folder prawym przyciskiem myszy i przejdź do Properties, a następnie kliknij Securitykartę, a następnie kliknij Advanced, a następnie Ownerkartę i kliknij Edit. Zaznacz „Zastąp właściciela subkontenerów i obiektów”, następnie wybierz nowego właściciela (np. Grupę „Administratorzy”), a następnie powiedz OK.

Sam P.
źródło
Ugh, nie musisz brać na własność. Po prostu daj Usersgrupie uprawnienia do modyfikacji. Jednak należy nie mieć pełny dostęp do plików programu. Domyślnie każdy, kto jest administratorem, był złym wyborem projektowym i próbowali go naprawić w systemie Vista.
Scott Chamberlain,