【问题标题】:Process.Start in Windows\System32 folderProcess.Start 在 Windows\System32 文件夹中
【发布时间】:2018-10-30 09:15:56
【问题描述】:

试图以管理员身份启动位于 System32 中的文件,但它一直告诉我它不存在。

错误:系统找不到指定的文件 构建目标平台是:x86。 当前操作系统:Windows 8.1 x64。对于 32 位和 64 位操作系统,我宁愿没有 2 个不同的 .exe。

p.StartInfo.Verb = "runas";
p.StartInfo.FileName =
    Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System),"Defrag.exe");
    //above points to c:\windows\system32\defrag.exe
p.StartInfo.Arguments = @"c:\ /A";
p.Start();
p.WaitForExit();

我也尝试了以下没有运气

p.StartInfo.FileName = 
    Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "sysnative", "Defrag.exe");

更新

将应用程序从 x86 切换到任何 CPU 更正了问题

【问题讨论】:

  • 请(总是)显示完整的异常(ex.ToString())。
  • 您是否运行在 64 位版本的 Windows 7/8 上?如果是这样,请尝试从 Any CPU 将构建目标设置为 64 位。 Windows 使用 sysnative 做了一些奇怪的事情。我们“认为”的某些文件在 System32 中,但实际上并非如此,因为 Windows 不知道我们指的是哪个版本的文件。 sysnative,或替代。
  • 如果您从 bin\Debug(或 bin\Release)文件夹运行 .exe 并右键单击 ->“以管理员身份运行”,会发生什么情况。我想这可能是权限问题?
  • @SeanThoman 仍然找不到文件,动词 runas 应该以管理员身份启动 defrag.exe。
  • @DarkBobG 当前操作系统是 8 x64,但构建设置为 x86,因为我希望它是这样的,所以我没有 x86 和 x64 的构建。

标签: c#


【解决方案1】:

我的猜测是您在 64 位机器上运行此代码。如果我没记错的话,Environment.SpecialFolder.System 变量在 64 位机器上返回 C:\Windows\SysWOW64。快速搜索SysWOW64文件夹,错误信息正确,文件夹中不存在“Defrag.exe”。

出于测试目的,我会建议一些更简单的东西 即 Process.Start(@"C:\Windows\System32\defrag.exe")

然后您可以使用其他变量来构建基于系统架构的路径:
String processPath = Environment.Is64BitOperatingSystem ? Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.SystemX86), "Defrag.exe") : Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "Defrag.exe")

【讨论】:

  • 路径确实已经指向 Defrag.exe 所在的 System32。应用程序构建设置为 x86。
【解决方案2】:

使用Environment.SystemDirectory:

string filePath = Path.Combine(Environment.SystemDirectory, "defrag.exe");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 2013-01-15
    • 2016-06-01
    • 2015-10-07
    相关资源
    最近更新 更多