为什么不能在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 shell中,所有者是Administrators,而在Cygwin的bash shell中,所有者是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)2012年

可能是某种WoW64文件夹重定向(因为Cygwin是32位)?
安德鲁·兰伯特

Answers:


35

由于Windows Vista(UAC)引入了安全功能,任何试图写入受保护位置(例如“程序文件”)的非管理员程序都将捕获其写内容,并将其重定向到其他“用户友好”位置。

创建该文件的程序将能够看到该文件,但是大多数其他程序将看不到该文件。

维基百科指出(并且我已突出显示相关部分):

假设用户将以管理员权限运行的应用程序在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文件,因为它无法正常工作。
2012年

抱歉,我假设您正在对该文件运行cmake。为了使用任何文件,您必须将其写入其他位置,然后应该能够使用资源管理器将文件复制过来,您应该得到一个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

您将在此处找到文件。您也可以通过打开文件夹并按下窗口顶部的“ 兼容性文件”按钮来使用资源管理器。


谢谢。这个(和公认的答案)解决了我遇到的一个非常神秘的问题。现在已经完全解释了。您的答案很简短,很直接。+1谢谢!
ridgerunner

0

我有一个类似的问题,从Windows XP(从XP)迁移到Windows 7之后不久,我试图在其中解压缩文件C:\Program Files,但该文件一直给我一个Access Denied错误。

经过多番努力,我发现我必须拥有整个文件夹的所有权,然后才能更改允许管理员组“完全访问”的权限,我认为应该完全拥有该权限。

为了获得文件夹的所有权:右键单击该文件夹并转到Properties,然后单击Security选项卡,然后单击Advanced,然后单击该Owner选项卡,然后单击Edit。选中“在子容器和对象上替换所有者”,然后选择新所有者(例如,“管理员”组),然后说OK


gh,您不需要拥有所有权。只需授予该Users组修改权限即可。然而,你应该给予完全访问程序文件。每个人都默认是管理员是一个错误的设计选择,他们尝试在Vista中修复它。
Scott Chamberlain
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.