“File not found” error launching system32\winsat.exe using Process.Start()

前端 未结 2 703
别那么骄傲
别那么骄傲 2020-12-20 21:21

I\'m trying to run the Windows System Assessment Tool (winsat.exe) using the following code:

System.Diagnostics.Process WinSPro =
    new System.Diagnostics.         


        
相关标签:
2条回答
  • 2020-12-20 21:54

    winsat.exe is redirected using Windows-on Windows 64-bit redirection. What's happening is that your launch request (from a 32-bit process) is being redirected to %windir%\SysWOW64\winsat.exe. Since there's no 32-bit version of this particular executable on 64-bit installs, the launch fails. To bypass this process and allow your 32-bit process to access the native (64-bit) path, you can reference %windir%\sysnative instead:

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

    Alternatively, if you build your program as x64, you can leave the path as c:\windows\system32.

    Note that it's best to use Environment.GetFolderPath to get the path to the windows directory, just in case the OS is installed in a non-standard location:

    WinSSInfo.FileName = Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.Windows),
        @"sysnative\winsat.exe");
    
    0 讨论(0)
  • 2020-12-20 22:00

    Based on Simon MᶜKenzie's answer, and the link he provided (thanks to soyuz for his comment) I wrote method that should work in either cases (to just copy/paste the code):

    public static string GetSystem32DirectoryPath()
    {
        string winDir = Environment.GetFolderPath(Environment.SpecialFolder.Windows);
        string system32Directory = Path.Combine(winDir, "system32");
        if (Environment.Is64BitOperatingSystem && !Environment.Is64BitProcess)
        {
            // For 32-bit processes on 64-bit systems, %windir%\system32 folder
            // can only be accessed by specifying %windir%\sysnative folder.
            system32Directory = Path.Combine(winDir, "sysnative");
        }
        return system32Directory;
    }
    

    and code to launch the process:

    var pi = new ProcessStartInfo
    {
        FileName = Path.Combine(GetSystem32DirectoryPath(), "winsat.exe"),
        CreateNoWindow = true,
        UseShellExecute = false
    };
    Process.Start(pi);
    
    0 讨论(0)
提交回复
热议问题