从托管代码启动 Windows 沙箱
Starting the Windows Sandbox from managed code
我正在尝试以编程方式初始化 Windows Sandbox。
我的objective是生成一个.wsb
配置文件然后启动。
目前我正在使用 Process.Start()
方法,但我在 Start()
方法上不断收到错误消息。
这是代码:
var sbProc = new Process();
sbProc.StartInfo.FileName = configPath;
sbProc.Start();
sbProc.WaitForExit();
抛出: System.ComponentModel.Win32Exception: 'Application not found'
.
我确定该文件存在,因为我尝试通过双击和命令行打开它。两者都按预期工作,所以我假设它指的是关联的应用程序(在本例中 Windows 沙盒)。
我试过添加:
sbProc.StartInfo.UseShellExecute = false;
抛出: System.ComponentModel.Win32Exception: 'The specified executable is not a valid application for this OS platform.'
.
同样是异常,但是消息不同,其实很迷惑。如上所述,我 100% 确定我的 OS 支持此功能;每个要求都得到支持和启用。
是否有可能 Process.Start()
无法处理 .wsb
文件,如果是这样,我怎样才能实现我正在寻找的东西?
我愿意接受任何建议,在此先感谢您!
更新:
我尝试使用以下代码将动词更改为 Invoke
和 Start
:
sbProc.StartInfo.Verb = "Start";
和
sbProc.StartInfo.Verb = "Invoke";
抛出:System.ComponentModel.Win32Exception: 'No application is associated with the specified file for this operation'
如何关联和应用文件?
Windows 沙盒通过在资源管理器中双击并通过 cmd.exe /c start
工作,但无法在 C# 应用程序中以编程方式启动。原因是 C# 应用程序是 32 位的,而 OS 是 64 位的。
当 32 位应用程序尝试调用沙盒配置时,它(间接)尝试调用 %windir%\System32\WindowsSandbox.exe
可执行文件。但!当 32 位应用程序尝试访问包含 32 位版本系统应用程序和 DLL 的 64 位 Windows it is redirected to %windir%\SysWOW64
上的 %windir%\System32
时。由于没有 32 位 WindowsSandbox.exe
,.NET 框架抛出异常 System.ComponentModel.Win32Exception: 'Application not found'
。
有两种方法可以从 32 位用户应用启动 64 位系统应用。
计划A
使用%windir%\Sysnative
路径。它仅适用于 32 位应用程序并解析为真正的 64 位 System32
系统文件夹。
var sbProc = new Process();
sbProc.StartInfo.FileName = "%SystemRoot%\Sysnative\WindowsSandbox.exe";
sbProc.StartInfo.Arguments = "\"" +configPath + "\"";
sbProc.StartInfo.UseShellExecute = true;
sbProc.Start();
sbProc.WaitForExit();
我想,在这种情况下 WaitForExit
将等到沙盒完成。我不是 100% 确定,事情可能会在 Windows 发生,但请期待。
B计划
方案A存在以下风险:如果未来MS人员重命名沙箱的可执行文件或添加额外的CLI开关,直接调用可能会失败。您将不得不修改您的代码。
要避免它,您可以使用 cmd.exe
通过 start
命令启动沙箱。 cmd.exe
可以在幕后调用 64 位系统应用程序。
var sbProc = new Process();
sbProc.StartInfo.FileName = "cmd";
sbProc.StartInfo.Arguments = "/c start \"\" \"" +configPath + "\"";
sbProc.StartInfo.Start();
sbProc.WaitForExit();
唯一的问题是 WaitForExit
将在 start
完成后立即 return,而不是沙箱。 start
不等待启动的进程。
我正在尝试以编程方式初始化 Windows Sandbox。
我的objective是生成一个.wsb
配置文件然后启动。
目前我正在使用 Process.Start()
方法,但我在 Start()
方法上不断收到错误消息。
这是代码:
var sbProc = new Process();
sbProc.StartInfo.FileName = configPath;
sbProc.Start();
sbProc.WaitForExit();
抛出: System.ComponentModel.Win32Exception: 'Application not found'
.
我确定该文件存在,因为我尝试通过双击和命令行打开它。两者都按预期工作,所以我假设它指的是关联的应用程序(在本例中 Windows 沙盒)。
我试过添加:
sbProc.StartInfo.UseShellExecute = false;
抛出: System.ComponentModel.Win32Exception: 'The specified executable is not a valid application for this OS platform.'
.
同样是异常,但是消息不同,其实很迷惑。如上所述,我 100% 确定我的 OS 支持此功能;每个要求都得到支持和启用。
是否有可能 Process.Start()
无法处理 .wsb
文件,如果是这样,我怎样才能实现我正在寻找的东西?
我愿意接受任何建议,在此先感谢您!
更新:
我尝试使用以下代码将动词更改为 Invoke
和 Start
:
sbProc.StartInfo.Verb = "Start";
和
sbProc.StartInfo.Verb = "Invoke";
抛出:System.ComponentModel.Win32Exception: 'No application is associated with the specified file for this operation'
如何关联和应用文件?
Windows 沙盒通过在资源管理器中双击并通过 cmd.exe /c start
工作,但无法在 C# 应用程序中以编程方式启动。原因是 C# 应用程序是 32 位的,而 OS 是 64 位的。
当 32 位应用程序尝试调用沙盒配置时,它(间接)尝试调用 %windir%\System32\WindowsSandbox.exe
可执行文件。但!当 32 位应用程序尝试访问包含 32 位版本系统应用程序和 DLL 的 64 位 Windows it is redirected to %windir%\SysWOW64
上的 %windir%\System32
时。由于没有 32 位 WindowsSandbox.exe
,.NET 框架抛出异常 System.ComponentModel.Win32Exception: 'Application not found'
。
有两种方法可以从 32 位用户应用启动 64 位系统应用。
计划A
使用%windir%\Sysnative
路径。它仅适用于 32 位应用程序并解析为真正的 64 位 System32
系统文件夹。
var sbProc = new Process();
sbProc.StartInfo.FileName = "%SystemRoot%\Sysnative\WindowsSandbox.exe";
sbProc.StartInfo.Arguments = "\"" +configPath + "\"";
sbProc.StartInfo.UseShellExecute = true;
sbProc.Start();
sbProc.WaitForExit();
我想,在这种情况下 WaitForExit
将等到沙盒完成。我不是 100% 确定,事情可能会在 Windows 发生,但请期待。
B计划
方案A存在以下风险:如果未来MS人员重命名沙箱的可执行文件或添加额外的CLI开关,直接调用可能会失败。您将不得不修改您的代码。
要避免它,您可以使用 cmd.exe
通过 start
命令启动沙箱。 cmd.exe
可以在幕后调用 64 位系统应用程序。
var sbProc = new Process();
sbProc.StartInfo.FileName = "cmd";
sbProc.StartInfo.Arguments = "/c start \"\" \"" +configPath + "\"";
sbProc.StartInfo.Start();
sbProc.WaitForExit();
唯一的问题是 WaitForExit
将在 start
完成后立即 return,而不是沙箱。 start
不等待启动的进程。