System32 中的 Ruby Dir.foreach 缺少文件/File.exists?对于现有文件返回 false

2023-12-30

当我使用ruby打印出windows 7 system32目录中的所有文件时,有些文件丢失了。我使用这个简单的目录迭代:

Dir.foreach("C:\\Windows\\System32") do |fname|
  puts fname
end

我专门寻找 python27.dll,尽管它存在,但未打印。文件已存在?似乎与 dir 迭代有相同的问题。对于现有文件,它返回 false:

File.exists? "C:\\Windows\\System32\\python27.dll" #returns false

检查文件夹中的另一个现有文件是否有效:

File.exists? "C:\\Windows\\System32\\quartz.dll" #returns true

但如果我复制现有文件或在 system32 中创建新文件,则它不起作用

File.exists? "C:\\Windows\\System32\\quartz2.dll" #returns false

另外,将 python27.dll 复制到另一个目录并检查是否存在:

File.exists? "C:\\Otherfolder\\python27.dll" #returns true

该问题与字母大小写或路径分隔符无关。我查了一下。另外,我没有看到有效和无效文件的用户权限差异......

我真的不知道为什么会发生这种情况...任何人都可以重现这个吗???

thanks

[edit]

花了一段时间,但我找到了答案。

这是一个 32/64 位问题。对于 Ruby 作为 32 位应用程序,“C:\Windows\System32”实际上是“C:\Windows\SysWOW64”。正如 64 位 WinExplorer 所示,python27.dll 位于 System32 中(只有 64 位进程才能看到 - 嗯,令人困惑),而它应该位于 SysWOW64 中,以便 ruby​​ 看到。安装 32 位版本的 Python 解决了我的问题(因为我无法更改 ruby​​ 脚本,因为它是 ruby​​python 的一部分)。


在 Windows 7(实际上是 Vista)中,早期版本的 Windows 中仅存在于纸面上的许多安全策略现在实际上由操作系统强制执行。例如,根据微软的文档,写入到C:\Windows\System32几十年来,但如果你真的尝试过,它仍然有效。不再。从维斯塔开始,C:\Windows\System32是禁区。

然而,为了不破坏现有的(损坏的)应用程序,微软引入了文件系统虚拟化。如果应用程序尝试写入C:\Windows\System32,它会默默地重定向到C:\Users\%Username%\AppData\Local\VirtualStore\Windows\System32。因此,这个特定的应用程序可以看到它创建或更改的所有文件C:\Windows\System32, but other应用程序只能看到未更改的/空目录。

这不仅仅适用于C:\Windows\System32还可以访问其他系统目录。此外,它还适用于注册表的系统部分,例如HKEY_LOCAL_MACHINE例如。

这种虚拟化是针对每个应用程序的。 IE。如果应用程序 A 尝试在受保护的目录中创建或修改文件,Windows 将拦截该调用并将其重定向到 VirtualStore。它还会在某处记录此重定向。现在,当同一个应用程序 A 尝试再次查看那里时,Windows 将使用记录的重定向,以便该应用程序thinks文件就在它放置的地方,而事实上,它完全在其他地方。

然而,如果一个不同的应用程序 B 查看该目录,然后不会触发重定向,B 只会看到原始的系统目录。这就是重点:在过去,不同的应用程序会通过覆盖系统目录中彼此的文件来创建各种奇怪的错误。 IE。一个应用程序会转储其python27.dll into C:\Windows\System32另一个应用程序会转储its自己的,略有不同的不兼容版本python27.dll,覆盖第一个。

所以,你用过one应用程序将 DLL 复制到那里(可能是explorer.exe)并且你使用不同的应用程序,即ruby.exe看看它。但explorer.exe没有actually将其复制到system32,它被重定向到 VirtualStore。当你使用explorer.exe,重定向被触发,您会在您所在的位置看到该文件think你把它放了,但是当你使用时ruby.exe,重定向确实not被触发,它会看到目录的实际情况。

I bet that

File.exists? "C:/Users/#{ENV['Username']}/AppData/Local/VirtualStore/Windows/System32/python27.dll"

returns true.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

System32 中的 Ruby Dir.foreach 缺少文件/File.exists?对于现有文件返回 false 的相关文章

随机推荐