为什么我无法在 Windows 7 上编辑“Program Files”文件?

为什么我无法在 Windows 7 上编辑“Program Files”文件?

我在 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

怎么会这样?就好像在同一个目录中有两个同名的不同文件一样。

答案1

由于 Windows Vista 引入了安全功能(联合航空) 任何试图写入受保护位置(例如“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,并使用不受保护的位置,例如您的用户配置文件内的某个位置。

答案2

Program Files 文件夹受管理员权限保护。在 Windows XP 及更早版本中,大多数人始终以管理员身份运行。许多程序都假定情况如此,并在 Program Files 文件夹中完成所有工作。

当 Windows Vista 发布时,他们停止了这种做法,强制应用程序改用:

C:\Users\%用户名%\AppData

这破坏了许多旧应用程序。为了允许旧应用程序继续使用仅限管理员的文件夹,Windows 创建了一个虚拟存储来保存已更改的文件。请查看:

C:\Users\%用户名%\AppData\Local\VirtualStore

您将在那里找到文件。您也可以使用资源管理器,打开文件夹并按兼容性文件窗口顶部的按钮。

答案3

我遇到了类似的问题,在从 XP 转到 Windows 7 后不久,我试图解压里面的一个文件C:\Program Files,但它一直给我一个“拒绝访问”错误。

经过一番周折之后,我发现我必须先拥有整个文件夹的所有权,然后才能更改权限以允许管理员组完全访问 - 我认为,它应该拥有该权限。

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

相关内容