【问题标题】:File.Exists returns false,Process.Start() can't start the file,But it actually existsFile.Exists 返回 false,Process.Start() 无法启动文件,但它确实存在
【发布时间】:2020-04-01 06:50:29
【问题描述】:

注意:我的计算机上启用了 Windows 沙盒。

Console.WriteLine(File.Exists(@"C:\Windows\system32\WindowsSandbox.exe"));
Console.WriteLine(new FileInfo(@"C:\Windows\system32\WindowsSandbox.exe").Exists);

C# Interactive中运行上述代码(VS不在管理员模式):

True
True

但是,当我在控制台应用程序中运行它时, (管理员模式和非管理员模式)。结果总是假的。

False
False

我试过Process.Start(@"C:\Windows\system32\WindowsSandbox.exe"), 控制台应用程序失败(管理员和非管理员),但 C# 交互成功。

在 powershell 中,C:\Windows\system32\WindowsSandbox.exe 成功启动了 Windows 沙盒。 在资源管理器(system32 文件夹)中: image

谁能解释为什么会发生这种情况?

【问题讨论】:

  • Window Sandbox 是否设置为运行管理员?
  • 我假设您使用的是 64 位 Windows?如果有,您是否有C:\Windows\SysWOW64\WindowsSandbox.exe 并且控制台应用程序是针对 32 位的?
  • 将 processStartInfo.Verb 设置为 "runas" 没有解决问题。@jdweng​​span>
  • 我使用的是64位windows,但是资源管理器的SysWOW64中没有WindowsSandbox.exe。@BACON
  • 在 64 位 Windows 上,除非您特意运行 32 位版本,否则资源管理器和 PowerShell 将是 64 位进程,因此将从 64-位系统目录,system32。如果您的应用程序是 32 位的,它会将您指定的路径重定向到 32 位系统目录SysWOW64。尝试将您的路径从WindowsSandbox.exe 更改为calc.exenotepad.exe,这两者在system32SysWOW64 中都肯定存在,看看它是否有效。我怀疑会的。

标签: c# .net windows windows-sandbox


【解决方案1】:

来自documentation

如果尝试执行任何错误,Exists 方法将返回 false 判断指定文件是否存在。这可能发生在某些情况下 引发异常,例如传递无效的文件名 字符或太多字符、磁盘故障或丢失,或者 如果 调用者没有读取文件的权限。

查看正在发生的事情的一种方法是尝试读取文件(例如使用 File.OpenRead)。如果成功,我会感到惊讶 - 但如果失败,异常应该会给你更多信息。还要从调用中检查运行命令时使用的身份(即cmd whoami 等)

【讨论】:

  • 它在管理员模式下得到 FileNotFoundException。但我很感兴趣为什么 C# 交互可以做到这一点。
【解决方案2】:

我不熟悉 Windows Sandbox,但听起来这是一个架构问题。

在 64 位 Windows 上,C:\Windows\system32 是 64 位系统目录。 Explorer 和 PowerShell,你说两者都可以看到 C:\Windows\system32\WindowsSandbox.exe,将是 64 位进程,除非你特意运行 32 位版本。

在 32 位应用程序中,路径 C:\Windows\system32 获取到 32 位系统目录 C:\Windows\SysWOW64redirected。由于您说您没有C:\Windows\SysWOW64\WindowsSandbox.exe 文件,并且您的应用程序也看不到(它认为是)C:\Windows\system32\WindowsSandbox.exe 文件,这表明您的应用程序是针对 32 位构建的。

所以,问题是没有 32 位版本的 Windows Sandbox 供您的 32 位应用程序运行。当您将路径更改为 calc.exenotepad.exe 时,您的相同代码可以工作,因为 Windows 提供了这些可执行文件的 32 位和 64 位版本。要让您的应用程序运行 64 位 WindowsSandbox.exe,您可以...

  • 针对 64 位构建它,或者更好...
  • 让它执行路径C:\Windows\sysnative\WindowsSandbox.exesysnative 是一个特殊别名,它允许 32 位应用程序引用本机(64 位)系统目录而无需重定向。

至于为什么 Visual Studio 能够看到 C:\Windows\system32\WindowsSandbox.exe,我真的无法解释。这取决于您使用的版本,但据我了解,它仍然是 32 位应用程序,尽管某些组件是 64 位的。至于调试器等组件是否会以与 OS 或正在构建的 应用程序 相同的架构运行,我真的不知道。

【讨论】:

  • 可能值得链接到documentation 并提及sysnative
  • 谢谢,@Damien_The_Unbeliever。我将其纳入我的答案中。
猜你喜欢
  • 2017-08-16
  • 2011-07-23
  • 1970-01-01
  • 2010-10-29
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
  • 2019-12-30
相关资源
最近更新 更多