ทำไมฉันไม่สามารถแก้ไขไฟล์“ 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 shell ดูเหมือนว่าไฟล์จะไม่ถูกเปลี่ยนแปลงเลย

สิ่งหนึ่งที่ฉันสังเกตเห็นคือในเชลล์ cmd เจ้าของคือผู้ดูแล แต่ใน bash shell ของ 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 บิต)
Andrew Lambert

คำตอบ:


35

เนื่องจากคุณลักษณะด้านความปลอดภัยที่นำมาใช้กับ Windows Vista ( UAC ) โปรแกรมที่ไม่ใช่ผู้ดูแลระบบใด ๆ ที่พยายามเขียนไปยังตำแหน่งที่ได้รับการป้องกันเช่น "ไฟล์โปรแกรม" จะได้รับการเขียนที่จับได้และเปลี่ยนเส้นทางไปยังตำแหน่ง

โปรแกรมที่สร้างไฟล์จะสามารถดูไฟล์ได้ แต่โปรแกรมส่วนใหญ่จะไม่สามารถใช้งานได้

สถานะ Wikipedia (และฉันได้เน้นหัวข้อที่เกี่ยวข้องแล้ว):

แอปพลิเคชันที่เขียนขึ้นโดยมีข้อสันนิษฐานว่าผู้ใช้จะทำงานด้วยสิทธิ์ผู้ดูแลระบบที่ประสบปัญหาใน Windows รุ่นก่อนหน้าเมื่อเรียกใช้จากบัญชีผู้ใช้ที่ จำกัด เนื่องจากมักจะพยายามเขียนไปยังเครื่องทั้งระบบหรือไดเรกทอรีระบบ (เช่น Program Files) หรือรีจิสตรีคีย์ (สะดุดตา HKLM) ความพยายามที่จะบรรเทา UAC นี้โดยใช้ไฟล์และ Registry Virtualization ซึ่งเปลี่ยนเส้นทางการเขียน (และต่อมาอ่าน) ไปยังสถานที่ต่อผู้ใช้ที่อยู่ในโปรไฟล์ของผู้ใช้ ตัวอย่างเช่นหากแอปพลิเคชันพยายามเขียนถึง“ C: \ program files \ appname \ settings.ini” และผู้ใช้ไม่มีสิทธิ์ในการเขียนไปยังไดเรกทอรีนั้นการเขียนจะถูกเปลี่ยนเส้นทางไปที่“ C: \ Users \ ชื่อผู้ใช้ \ 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 กับไฟล์ ในการใช้ไฟล์อะไรก็ตามที่คุณจะต้องเขียนไว้ที่อื่นคุณควรใช้ Explorer เพื่อคัดลอกไฟล์ทับคุณควรได้รับพรอมต์ UAC เพื่อให้แน่ใจว่านี่คือสิ่งที่คุณต้องการทำและหลังจากนั้น ไฟล์ของคุณควรถูกเขียนทับ สิ่งสำคัญคือคุณสามารถใช้โปรแกรมที่รับรู้ UAC เท่านั้น (เช่น Explorer) เพื่อคัดลอก / เขียนไฟล์ในตำแหน่งเหล่านั้น
Mokubai

ปิดการใช้งาน UAC ไม่ได้เป็นเพียงรอบการทำงาน คุณเพียงแค่ต้องให้ไฟล์ / ไดเรกทอรีที่ก่อให้เกิดปัญหาการModifyอนุญาตให้Usersกลุ่มผู้ใช้โดยไปที่แท็บความปลอดภัยของไฟล์ / โฟลเดอร์
Scott Chamberlain

ฮ่า ๆ พฤติกรรมนี้แปลกประหลาด! มันอธิบายถึงความแปลกประหลาดมากมายที่ฉันมี ขอบคุณ
Jez

13

โฟลเดอร์ Program Files ได้รับการคุ้มครองตามสิทธิ์ของผู้ดูแลระบบ ใน Windows XP และก่อนหน้านี้คนส่วนใหญ่วิ่งเป็นผู้ดูแลระบบตลอดเวลา หลายโปรแกรมสันนิษฐานว่าเป็นกรณีนี้และทำงานทั้งหมดในโฟลเดอร์ Program Files

เมื่อมีการเปิดตัว Windows Vista พวกเขาจะหยุดการฝึกฝนนี้บังคับให้แอปพลิเคชันใช้แทน

C: \ Users \% username% \ AppData

สิ่งนี้ทำให้แอปพลิเคชันรุ่นเก่าเสียหาย ในการอนุญาตให้แอปพลิเคชันรุ่นเก่าใช้โฟลเดอร์ผู้ดูแลระบบต่อไปได้อย่างต่อเนื่อง Windows ได้สร้างร้านค้าเสมือนเพื่อเก็บไฟล์ที่มีการเปลี่ยนแปลง

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

คุณจะพบไฟล์ของคุณที่นั่น คุณยังสามารถใช้ Explorer โดยเปิดโฟลเดอร์และกดปุ่มความเข้ากันได้ของไฟล์ที่ด้านบนของหน้าต่าง


ขอบคุณ (และคำตอบที่ยอมรับ) นี้แก้ปัญหาที่ลึกลับมากที่ฉันมี ทำให้รู้สึกที่สมบูรณ์แบบในขณะนี้ที่มีการอธิบาย คำตอบของคุณสั้นและตรงประเด็น +1 ขอบคุณ!
ridgerunner

0

ฉันมีปัญหาที่คล้ายกันไม่นานหลังจากย้ายไปเป็น Windows 7 (จาก XP) ฉันพยายามคลายซิปไฟล์ที่อยู่ข้างในC:\Program Filesและมันทำให้ฉันมีข้อผิดพลาดในการเข้าถึงถูกปฏิเสธ

หลังจากการต่อสู้มากฉันพบว่าฉันต้องเป็นเจ้าของทั้งโฟลเดอร์ก่อนที่ฉันจะสามารถเปลี่ยนการอนุญาตให้กลุ่มผู้ดูแลระบบเข้าถึงแบบเต็ม - ซึ่งในความคิดของฉันมันควรจะมี

เพื่อที่จะใช้ความเป็นเจ้าของของโฟลเดอร์: คลิกขวาที่โฟลเดอร์และไปPropertiesแล้วคลิกที่Securityแท็บแล้วคลิกAdvancedแล้วแท็บและคลิกOwner Editตรวจสอบ "แทนที่เจ้าของบน subcontainers และวัตถุ" จากนั้นเลือกเจ้าของใหม่ (เช่น "ผู้ดูแลระบบ" กลุ่ม) OKแล้วบอกว่า


ใช่คุณไม่จำเป็นต้องเป็นเจ้าของ เพียงแค่ให้Usersกลุ่มแก้ไขสิทธิ์ อย่างไรก็ตามคุณไม่ควรเข้าถึงไฟล์โปรแกรมอย่างสมบูรณ์ ค่าเริ่มต้นของทุกคนที่เป็นผู้ดูแลระบบคือตัวเลือกการออกแบบที่ไม่ดีและพวกเขาพยายามแก้ไขใน Vista
Scott Chamberlain
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.