为什么我不能在 Windows 7 上编辑“程序文件”文件?

Dan*_*Dan 26 windows-7 file-permissions

我在 Windows 7 上编辑此文件时遇到问题:

C:\Program Files (x86)\CMake 2.8.7\share\cmake-2.8\Modules\FindJNI.cmake
Run Code Online (Sandbox Code Playgroud)

如果我在 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
Run Code Online (Sandbox Code Playgroud)

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

Mok*_*bai 37

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

制作该文件的程序将能够看到该文件,但大多数其他程序则不能。

维基百科声明(并且我已经突出显示了相关部分):

假设用户将以管理员权限运行而编写的应用程序在从有限的用户帐户运行时在早期版本的 Windows 中遇到问题,通常是因为它们试图写入机器范围或系统目录(例如程序文件)或注册表项(特别是香港邮政)。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 并使用不受保护的位置,例如您的用户配置文件中的某个位置。


Han*_*ood 13

Program Files 文件夹受管理员权限保护。在 Windows XP 及更早版本中,大多数人一直以管理员身份运行。许多程序都认为是这种情况,并在 Program Files 文件夹中完成所有工作。

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

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

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

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

你会在那里找到你的文件。您还可以通过打开文件夹并按窗口顶部的“兼容性文件”按钮来使用资源管理器。