![](/img/trans.png)
[英]Process.Start for system32 applications - The System Cannot Find the File Specified
[英]“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:
通過將"winsat.exe"
分配給ProcessStartInfo.FileName
直接調用它。 它因Win32Exception
The system cannot find the file specified
失敗: The system cannot find the file specified
如上所述,使用完整路徑 - @"c:\\windows\\system32\\winsat.exe"
。 它失敗並出現同樣的錯誤。
以系統管理員身份運行代碼。 它仍然失敗。
如編碼示例中那樣調用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.