【问题标题】:Program (c#) Running Elevated, Still Can't Access Some Files程序(c#)运行提升,仍然无法访问某些文件
【发布时间】:2011-05-17 19:15:15
【问题描述】:

我的代码正在提升,但什么都看不到/执行 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"

谢谢蒂姆!

【问题讨论】:

  • 你有任何杀毒软件或软件拦截电话吗?这是我最初的理论。

标签: c# windows uac


【解决方案1】:

让我猜猜……您是在 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 的想法发挥作用,但我希望这对你有用,或者你可以实现重定向的启用/禁用。

【讨论】:

  • 你可能是个通灵者!我确实需要这是一个 x86 应用程序,而且我在 x64 上。但是,我非常非常困惑。 Directories.GetFile() 怎么可能不列出文件???您是否建议它在运行 x86 时仅列出 x86 应用程序?这看起来非常奇怪。我必须运行 x86,如果发生这种情况,肯定有办法解决这个问题。
  • 你是对的!我重新编译为x64,果然找到了文件。但是......我真的,真的需要从 x86 调用这个东西。当然还有另一种方法可以测试 x64 应用的存在并从 x86 应用启动。
  • 我编辑了我的帖子,提供了更多关于它为什么这样做的信息以及您可以采取的几个选项来解决它。
  • 蒂姆,非常感谢!不用说它非常令人困惑,我完全忘记了我现在要阅读的所有奇怪的 x64 重定向内容。一旦我得到它的工作,我会发布我找到的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 2018-07-26
  • 2022-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多