Windows Sandbox是一个很棒的工具,但有一些限制。在此博客文章中,我们将讨论如何使用脚本或ScoopBox解决这些限制。
什么是Windows Sandbox?从技术上讲,Windows Sandbox是按需创建的轻量级虚拟机,用户可以安全地独立运行应用程序。该虚拟机使用与主机相同的OS映像。Windows沙盒环境中安装的软件保持“沙盒”状态,并且与基本计算机分开运行。当试图单独分析某些程序时,这是理想的选择。
如何启用Windows沙盒?- 首先,机器应使用Windows 10 Pro或Enterprise,内部版本18305或更高版本。
- 应该从BIOS在计算机上启用虚拟化。
- 使用任务栏上的搜索栏,然后键入“打开和关闭Windows功能”以访问Windows可选功能工具。选择Windows沙盒,然后单击确定。
- 如果出现提示,请重新启动计算机。
在此处查看官方文档中详细的分步安装信息。
如何使用配置文件配置Windows沙盒?Windows Sandbox支持简单的配置文件,使我们能够自定义最小的参数集。配置文件的格式为XML。
配置文件使用户可以控制Windows沙盒的以下方面:
- vGPU(虚拟GPU):启用或禁用虚拟GPU。如果禁用了vGPU,则沙盒将使用Windows Advanced Rasterization Platform(WARP)。
- 网络:在沙盒中启用或禁用网络访问
- 映射的文件夹:从主机共享具有读取或写入权限的文件夹。请注意,暴露主机目录可能会允许恶意软件影响系统或窃取数据。
- 登录命令: Windows沙盒启动时执行的命令
- 音频输入:共享主机对麦克风的沙盒输入
- 视频输入:共享主机的网络摄像头输入到沙盒
- 受保护的客户端:将增强的安全性设置放在RDP会话中的沙盒中
- 打印机重定向:将打印机从主机共享到沙盒中
- 剪贴板重定向:与沙盒共享主机剪贴板,以便可以来回粘贴文本和文件
- 内存(MB):分配给沙盒的内存量(以兆字节为单位)
您所要做的就是打开notepad.exe并指定您希望沙盒实例具有的选项。
完整的沙盒文件如下所示:
Disable
Disable
C:\Users\Public\Downloads
C:\Users\WDAGUtilityAccount\Desktop
true
explorer.exe C:\users\WDAGUtilityAccount\Downloads
保存扩展名为.wsb的文件,您将获得Windows Sandbox图标,您可以双击该图标以启动实例。
使用Windows沙盒存在一个主要问题。与其他任何虚拟机不同,Windows沙盒关闭时将删除所有用户数据。这包括在任何位置创建的每个文件以及计算机上安装的每个程序。这不是用户可以打开或关闭的东西。这就是它的设计方式。
用户每次登录环境时,都应安装所需的所有软件。
有针对这个的解方法吗?当然有。
解决方案如果我们检查配置文件,我们会看到Windows Sandbox- Logon命令中有一个执行脚本的选项。
尽管此登录命令看起来像一个集合,感觉像一个集合,行为像一个集合,但文档并没有明确说明,它实际上不是一个集合,并且只能执行一个脚本。
这是一个在Windows沙盒中安装Fiddler和Curl的PowerShell脚本。
# Download and install Scoop Package manager
# Note: This will not work if you disable the network access from
# Windows Sandbox configuration file.
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')
# Scoop package manager requires git to be able to install most software.
scoop install git
# Add extra buckets so we have more software to choose from.
scoop bucket add extras
scoop bucket add nerd-fonts
scoop bucket add nirsoft
scoop bucket add java
scoop bucket add jetbrains
scoop bucket add nonportable
scoop bucket add php
# Install Fiddler and Curl
scoop install fiddler, curl
创建PowerShell之后,我们必须在虚拟机内部传输它。如果您查看示例XML文件,则有一个MappedFolder部分可以用来在其中复制脚本。
例如,如果将脚本放入桌面的Scripts文件夹中,并希望从沙盒内部执行脚本,则配置应如下所示:
Disabled
Default
C:\Users\YOUR_USERNAME\Desktop\Scripts
C:\Users\WDAGUtilityAccount\Desktop\Sandbox\
false
powershell.exe -ExecutionPolicy Bypass
-File C:\Users\WDAGUtilityAccount\Desktop\Sandbox\MainScript.ps1
Default
Default
Default
Default
Default
0
注意:默认用户没有权限在沙盒中执行脚本。这就是为什么我们必须设置执行策略才能看到脚本运行的原因。
将其另存为.wsb文件并运行。一段时间后,您应该会看到已安装程序,然后就可以开始工作了。
什么是ScoopBox?ScoopBox 是一个C#库,可自动执行配置文件的构建并生成一个脚本,该脚本中包含要使用PowerShell执行的命令。
ScoopBox使用首选方式进行安装。
如何安装Install-Package ScoopBox -Version 1.0.0
dotnet add package ScoopBox --version 1.0.0
如何使用ScoopBox?
以下是一些ScoopBox工作原理的示例。
使用预安装的应用程序启动Windows沙盒ISandbox sandbox = new Sandbox();
await sandbox.Run(new ScoopPackageManagerScript
(new List() { "curl", "fiddler", "vscode" }));
使用用户脚本启动Windows沙盒
ISandbox sandbox = new Sandbox();
await sandbox.Run(new List()
{
new ExternalScript(new FileInfo(@"C:\Users\Scripts\StartBrowser.ps1"),
new PowershellTranslator()),
new ExternalScript(new FileInfo(@"C:\Users\Scripts\StartExplorer.ps1"),
new PowershellTranslator()),
});
使用组合脚本启动Windows沙盒
ISandbox sandbox = new Sandbox();
await sandbox.Run(new List()
{
// PowerShell script as string to open notepad
new LiteralScript(new List()
{ @"Start-Process 'C:\windows\system32\notepad.exe'" }, new PowershellTranslator()),
// Cmd script to open a browser
new ExternalScript
(new FileInfo(@"C:\Users\Scripts\StartBrowser.cmd"), new CmdTranslator()),
// Bat script to open explorer
new ExternalScript(new FileInfo
(@"C:\Users\Scripts\OpenExplorer.bat"), new BatTranslator()),
// Scoop package manager that installs curl and fiddler
new ScoopPackageManagerScript(new List(){ "curl", "fiddler" }),
});
所有脚本均按其定义的顺序运行。
IOptions options = new Options()
{
AudioInput = AudioInputOptions.Enable,
PrinterRedirection = PrinterRedirectionOptions.Enable,
Networking = NetworkingOptions.Default,
VGpu = VGpuOptions.Enabled,
// ...
};
ISandbox sandbox = new Sandbox(options);
结论
Windows Sandbox是一个很棒的工具,但有一些限制。在此博客文章中,我们讨论了如何使用脚本或ScoopBox来解决这些限制。还可以看看github中的ScoopBox。
https://www.codeproject.com/Articles/5287300/ScoopBox