簡體   English   中英

使用Process.Start()啟動system32 \\ winsat.exe時出現“找不到文件”錯誤

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

我正在嘗試使用以下代碼運行Windows系統評估工具 (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 The system cannot find the file specified失敗: The system cannot find the file specified

  2. 如上所述,使用完整路徑 - @"c:\\windows\\system32\\winsat.exe" 它失敗並出現同樣的錯誤。

  3. 以系統管理員身份運行代碼。 它仍然失敗。

  4. 如編碼示例中那樣調用winsat.exe。 它像我之前解釋的那樣失敗了。

有趣的是,從代碼啟動的命令提示符只能在c:\\ windows \\ system32中看到.dll文件。

有誰知道為什么winsat.exe無法通過System.Diagnostics.Process啟動? 有沒有我誤解的限制?

謝謝,

雷克斯

使用Windows-on Windows 64位重定向重定向 winsat.exe 發生的事情是您的啟動請求(來自32位進程)被重定向到%windir%\\SysWOW64\\winsat.exe 由於在64位安裝上沒有此特定可執行文件的32位版本,因此啟動失敗。 要繞過此過程並允許32位進程訪問本機(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");

基於SimonMᶜKenzie的回答 ,以及他提供的鏈接(感謝soyuz的評論)我編寫的方法應該適用於任何一種情況(只需復制/粘貼代碼):

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;
}

以及啟動該過程的代碼:

var pi = new ProcessStartInfo
{
    FileName = Path.Combine(GetSystem32DirectoryPath(), "winsat.exe"),
    CreateNoWindow = true,
    UseShellExecute = false
};
Process.Start(pi);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM