c# - "File not found"使用 Process.Start() 启动 system32\winsat.exe 时出错

标签 c# process system.diagnostics wow64

我正在尝试运行 Windows System Assessment Tool (winsat.exe) 使用以下代码:

System.Diagnostics.Process WinSPro =
    new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo WinSSInfo = 
    new System.Diagnostics.ProcessStartInfo();
WinSSInfo.FileName = "cmd.exe";
WinSSInfo.Arguments = "/k winsat.exe";
WinSPro.StartInfo = WinSSInfo;
WinSPro.Start();

如果我只调用 cmd.exe,这段代码就可以工作,即使我调用 regedit.exe,它仍然可以工作。 但是,当我尝试调用 winsat.exe 作为 cmd.exe 的参数时,它失败了。 命令提示符显示:

'winsat.exe' is not recognized as an internal or external command, 
operable program or batch file.

我尝试了几种调用winsat.exe的方法:

  1. 通过将"winsat.exe" 分配给ProcessStartInfo.FileName 直接调用它。它因 Win32Exception 而失败:系统找不到指定的文件

  2. 如上,使用完整路径 - @"c:\windows\system32\winsat.exe"。它失败并出现相同的错误。

  3. 以系统管理员身份运行代码。还是失败了。

  4. 按照编码示例调用 winsat.exe。正如我之前解释的那样,它失败了。

有趣的是,从代码启动的命令提示符只能看到c:\windows\system32中的.dll文件。

有谁知道为什么 winsat.exe 无法通过 System.Diagnostics.Process 启动?是否有任何我误解的限制?

谢谢,

雷克斯

最佳答案

winsat.exe 使用 Windows-on Windows 64-bit redirection 重定向.发生的情况是您的启动请求(来自 32 位进程)被重定向到 %windir%\SysWOW64\winsat.exe。由于在 64 位安装上没有此特定可执行文件的 32 位版本,因此启动失败。要绕过此进程并允许您的 32 位进程访问 native (64 位)路径,您可以改为引用 %windir%\sysnative:

Process WinSPro = new Process();
ProcessStartInfo WinSSInfo = new ProcessStartInfo();
WinSSInfo.FileName = @"c:\windows\sysnative\winsat.exe";
WinSPro.StartInfo = WinSSInfo;
WinSPro.Start();

或者,如果您将程序构建为 x64,则可以将路径保留为 c:\windows\system32

请注意,最好使用 Environment.GetFolderPath 获取 windows 目录的路径,以防操作系统安装在非标准位置:

WinSSInfo.FileName = Path.Combine(
    Environment.GetFolderPath(Environment.SpecialFolder.Windows),
    @"sysnative\winsat.exe");

关于c# - "File not found"使用 Process.Start() 启动 system32\winsat.exe 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16827229/

相关文章:

bash - 是否可以将 STDIN 分布到并行进程中?

c# - 使用 CorrelationManager 链接多个 TraceSource 事件

.net 诊断最佳实践?

c# - LINQ on 循环条件

c# - 如何禁用 DataGridView CheckBox 列中的特定复选框单元格

c# - 带有 MonoTouch.Dialog 的底部标签栏?

c++ - 使用其 PID 写入 STDIN 以进行处理

vb.net - 检测exe何时启动vb.net

c# - 如何查看报告背后的 XML (RDLC)

C# 自定义记录器 - 捕获发送对象的最佳方法