程序(c#)运行升高,仍然无法访问某些文件

时间:2011-05-17 19:15:15

标签: c# windows uac

我的代码正在升级,但没有任何东西可以看到/执行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”

谢谢蒂姆!

1 个答案:

答案 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这个想法有效,但我希望这对您有用或者您可以实现重定向的启用/禁用。