我的代码正在升级,但没有任何东西可以看到/执行c:\ windows \ system32 \ rstrui.exe(系统还原点UI)。
我仔细检查以确保代码确实正在升级(它是),并且我已经使用File.Exist()和Directory.GetFiles()以及System.Diagnostics.Process.Start()进行了测试;找不到文件是返回的内容。
程序真的存在,我可以真正运行它,我可以将路径复制/粘贴到DOS并列出,执行它(没有隐藏空格等)。
有什么想法吗?
解决方案:
Tim(下面)给了我解决方案,而不是引用c:\ windows \ system32引用c:\ windows \ sysnative。 “sysnative”被重定向,或者,好吧,没有。我对x64重定向的东西仍然有点困惑。关键是,以下工作:
Environment.GetEnvironmentVariable(“windir”)+ @“\ sysnative”
谢谢蒂姆!
答案 0 :(得分:7)
让我猜一下......你在64位Windows安装上运行x86应用程序? 我不确定原因,但this thread提供了一些信息。 如果你为原生64位(或我认为的任何CPU)而不是x86编译它,它将正确找到该文件。
原因是系统文件夹重定向在64位操作系统中正在WOW64下运行的应用程序上进行。您可以阅读更多相关信息here。该帖子中一个特别相关的部分是谈论如何绕过它:
应用程序可以控制WOW64 文件系统重定向器使用 Wow64DisableWow64FsRedirection, Wow64EnableWow64FsRedirection,和 Wow64RevertWow64FsRedirection 功能。禁用文件系统 重定向会影响所有文件 通过呼叫执行的操作 线程,所以它应该只被禁用 当需要单个CreateFile时 立即呼叫并重新启用 函数返回后。禁用 文件系统重定向时间更长 句点可以防止32位 来自加载系统DLL的应用程序, 导致应用程序失败。
32位应用程序可以访问 本机系统目录 用%windir%\ Sysnative代替 %WINDIR%\ System32中。 WOW64认可 Sysnative是一个特殊的别名 表明文件系统应该 不重定向访问。这个 机制灵活易用, 因此,这是推荐的 绕过文件系统的机制 重定向。注意64位 应用程序无法使用Sysnative 别名,因为它不是虚拟目录 一个真实的。
我无法让%windir%\Sysnative
这个想法有效,但我希望这对您有用或者您可以实现重定向的启用/禁用。