Mengapa saya tidak bisa mengedit file “Program Files” di Windows 7?

25

Saya mengalami kesulitan mengedit file ini di Windows 7:

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

Jika saya mengeditnya di Cygwin (vi) atau TextPad, kedua program itu melihat perubahannya, jadi itu ditulis ke disk di suatu tempat . Tetapi jika saya "mengetik" file dalam shell cmd DOS, sepertinya file tersebut belum berubah sama sekali.

Satu hal yang saya perhatikan adalah bahwa di shell cmd, pemiliknya adalah Administrator, tetapi di shell bash Cygwin, pemiliknya adalah 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

Bagaimana ini bisa terjadi? Sepertinya ada dua file berbeda dengan nama yang sama di direktori yang sama.

Dan
sumber
Apakah Anda menerima pesan kesalahan?
ChrisF
Mungkinkah itu semacam pengalihan folder WoW64 (karena Cygwin adalah 32 bit)?
Andrew Lambert

Jawaban:

35

Karena fitur keamanan yang diperkenalkan dengan Windows Vista ( UAC ), setiap program non-Administrator yang mencoba menulis ke lokasi yang dilindungi seperti "Program Files" akan membuat tulisan mereka ketahuan dan dialihkan ke lokasi "ramah pengguna" alternatif.

Program yang membuat file akan dapat melihat file, tetapi sebagian besar program lain tidak.

Status Wikipedia (dan saya telah menyoroti bagian yang relevan):

Aplikasi yang ditulis dengan asumsi bahwa pengguna akan berjalan dengan hak administrator mengalami masalah dalam versi Windows yang lebih lama ketika dijalankan dari akun pengguna yang terbatas, seringkali karena mereka berusaha menulis ke direktori mesin atau direktori sistem (seperti File Program) atau kunci registri (terutama HKLM). UAC berupaya meringankan ini dengan menggunakan Virtualisasi File dan Registri, yang mengarahkan ulang penulisan (dan selanjutnya dibaca) ke lokasi per pengguna dalam profil pengguna . Misalnya, jika suatu aplikasi mencoba untuk menulis ke "C: \ program files \ appname \ settings.ini" dan pengguna tidak memiliki izin untuk menulis ke direktori itu, penulisan akan diarahkan ke "C: \ Users \ username \ AppData \ Local \ VirtualStore \ Program Files \ appname \ settings.ini ”.

Jadi secara teori file Anda yang diubah sebenarnya sedang ditulisC:\Users\YourUserName\AppData\Local\VirtualStore\Program Files (x86)\CMake 2.8.7\share\cmake-2.8\Modules

Satu-satunya cara mengatasi pembatasan ini adalah menonaktifkan UAC sepenuhnya , yang tidak direkomendasikan untuk alasan keamanan.

Solusi terbaik adalah yang seharusnya memiliki cmake di jalur Anda dan menggunakan lokasi yang tidak dilindungi seperti di suatu tempat di dalam profil pengguna Anda.

Mokubai
sumber
Terima kasih. Sangat membingungkan. Bagaimana bisa cmake di jalan saya (atau tidak) membuat perbedaan? Masalahnya adalah saya mencoba men-debug file cmake ini, karena tidak berfungsi dengan baik.
Dan
Maaf, saya berasumsi Anda menjalankan cmake terhadap file. Untuk menggunakan file apa pun yang Anda harus menulisnya di tempat lain maka Anda harus dapat menggunakan Explorer untuk menyalin file, Anda harus mendapatkan prompt UAC meminta Anda untuk memastikan ini adalah apa yang ingin Anda lakukan dan setelah itu file Anda harus ditimpa. Hal utama adalah bahwa Anda hanya dapat menggunakan program sadar UAC (seperti Explorer) untuk menyalin / menulis file di lokasi tersebut.
Mokubai
Menonaktifkan UAC bukan satu - satunya solusi . Anda hanya perlu memberikan file / direktori yang menyebabkan masalah Modifyizin ke Usersgrup pengguna dengan masuk ke tab keamanan file / folder.
Scott Chamberlain
LOL perilaku ini aneh! Ini menjelaskan banyak keanehan yang saya alami. Terima kasih.
Jez
13

Folder Program Files dilindungi oleh hak Administrator. Di Windows XP dan sebelumnya, kebanyakan orang berlari sebagai Administrator sepanjang waktu. Banyak program menganggap ini adalah masalahnya dan melakukan semua pekerjaan mereka di folder Program Files.

Ketika Windows Vista dirilis, mereka menghentikan praktik ini, memaksa aplikasi untuk menggunakan:

C: \ Users \% Username% \ AppData

Ini merusak banyak aplikasi lama. Untuk memungkinkan aplikasi yang lebih lama untuk terus menggunakan folder Administrator saja, Windows membuat toko virtual untuk menyimpan file yang diubah. Lihatlah:

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

Anda akan menemukan file Anda di sana. Anda juga dapat menggunakan Explorer dengan membuka folder dan menekan tombol File kompatibilitas di bagian atas jendela.

Makanan Tangan
sumber
Terima kasih. Ini (dan jawaban yang diterima) memecahkan masalah yang sangat misterius yang saya alami. Masuk akal sekarang setelah dijelaskan. Jawaban Anda singkat dan langsung pada intinya. +1 Terima kasih!
ridgerunner
0

Saya memiliki masalah yang sama, tak lama setelah pindah ke Windows 7 (dari XP) Saya mencoba membuka zip file di dalamnya C:\Program Filesdan itu terus memberi saya kesalahan Akses Ditolak.

Setelah banyak bergulat saya menemukan bahwa saya harus mengambil kepemilikan seluruh folder sebelum saya dapat mengubah izin untuk memungkinkan akses penuh grup Administrators - yang, menurut saya, seharusnya benar.

Untuk mengambil kepemilikan folder: klik kanan pada folder dan pergi ke Properties, lalu klik pada Securitytab, lalu klik Advanced, lalu Ownertab, dan klik Edit. Centang "Ganti pemilik pada subkontainer dan objek", lalu pilih pemilik baru (misalnya, grup "Administrator"), lalu ucapkan OK.

Sam P
sumber
Ugh, kamu tidak perlu mengambil kepemilikan. Cukup berikan Usersgrup memodifikasi izin. Namun Anda tidak boleh diberikan akses penuh ke file program. Default semua orang menjadi administrator adalah pilihan desain yang buruk dan mereka berusaha memperbaikinya di Vista.
Scott Chamberlain