程序(C#)以提升权限运行,仍无法访问某些文件。

3
我的代码在管理员权限下运行,但无法看到/执行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”
谢谢Tim!

2
你有任何防病毒软件或拦截调用的软件吗?那是我的最初理论。 - Tejs
1个回答

8
让我猜猜...你在64位的Windows上以x86应用程序运行? 我不确定原因,但这个帖子提供了一些信息。 如果您将其编译为本机64位(或任何CPU),而不是x86,则会正确找到文件。
这是因为64位操作系统中正在进行的系统文件夹重定向适用于在WOW64下运行的应用程序。您可以在此处阅读更多信息。该帖子中特别相关的一部分是关于如何解决它的:
应用程序可以使用Wow64DisableWow64FsRedirectionWow64EnableWow64FsRedirectionWow64RevertWow64FsRedirection函数控制WOW64文件系统重定向。禁用文件系统重定向会影响调用线程执行的所有文件操作,因此只有在必要时为单个CreateFile调用禁用它,并在函数返回后立即重新启用它。长时间禁用文件系统重定向可能会防止32位应用程序加载系统DLL,导致应用程序失败。
32位应用程序可以通过将%windir%\Sysnative替换为%windir%\System32来访问本地系统目录。WOW64将Sysnative识别为特殊别名,用于指示文件系统不应重定向访问。该机制灵活易用,因此是绕过文件系统重定向的推荐机制。请注意,64位应用程序无法使用Sysnative别名,因为它是一个虚拟目录而不是真实目录。
我无法使%windir%\Sysnative这个想法起作用,但我希望它对您有效,或者您可以实现启用/禁用重定向。

你可能是个心灵感应者!我需要这个是一个x86应用程序,但我在x64上。但是,我非常非常困惑。为什么Directories.GetFile()不能列出一个文件???你是在暗示它只会在x86运行时列出x86应用程序吗?那似乎非常奇怪。如果真的是这样,我必须运行x86,肯定有一种方法可以解决这个问题。 - Quinxy von Besiex
你是正确的!我已经重新编译为x64,确实找到了该文件。但是...我真的、真的需要从x86调用这个东西。肯定还有其他方法来测试和启动一个x64应用程序,让它从一个x86应用程序中运行。 - Quinxy von Besiex
我编辑了我的帖子,提供了更多关于为什么会这样以及你可以采取的几个选项来解决它的信息。 - Tim
Tim,非常感谢您!不用说这对我来说是极其困惑的事情,而且我已经完全忘记了所有奇怪的 x64 重定向的内容,现在我会去阅读一下相关资料。一旦我解决了问题,并使代码可行,我将发布解决方案。 - Quinxy von Besiex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接