Saber 酱的抱枕

Fly me to the moon

07/3
2024
软件

折腾了下 Sandboxie 和 Windows Sandbox

之前我把恶心的夸克网盘卸载了,但是现在又有资源需要用它下,不得不又下载回来。但是我不想把它安装在我的真实系统里了,那怎么办呢?用虚拟机的话有点重了,新安装一个系统需要不少磁盘空间,系统运行时也要不少内存。

Sandboxie

于是我想到了沙箱软件,有个成名已久的 Sandboxie,不过我之前没怎么用过,它似乎已经没有官方更新了,现在在 Github 上有个版本,是一些人自行维护更新的,界面重做了,功能也有改进,于是我下载安装了这个版本。

仓库地址:https://github.com/sandboxie-plus/Sandboxie

安装沙盒后,在夸克的 exe 安装程序上右键,选择“在沙盒中运行”,就可以把它安装到沙盒里,之后登录、下载文件,都正常。

在沙盒中运行程序时,程序窗口是和平时一样的独立窗口(也会出现在任务栏上),在任务管理器里也是可以照常看到程序的进程的。

Sandboxie 的界面如下:

但是我发现夸克在沙盘里访问本地文件依然是没有受到限制的。比如它每次启动都会提示我备份微信、QQ、桌面的文件,它在沙盒里也是直接读取了这些文件的,没有受到限制。

Sandboxie 会在 C 盘根目录创建一个 Sandbox 文件夹,存放在它里面安装的程序。比如夸克被安装在这个目录里:

C:\Sandbox\12477\DefaultBox\user\current\AppData\Local\Programs\quark-cloud-drive

在我退出夸克以及退出沙盒程序后,该目录依然存在,也就是在沙盒里面安装的程序文件是持久存在的。退出沙盒后,里面的文件不受影响,exe 文件可以直接运行(当然这样就不是在沙盒里了)。

所以我在沙盘里运行夸克,等于只是把它换了个安装位置而已。所以维基上说的我没懂啊:

它创造了一个类似沙盒的独立作业环境,在其内部运行的程序并不能对硬盘产生永久性的影响。其为一个独立的虚拟环境,可用以测试不受信任的应用程序或上网行为。

在我看来做不到啊,程序要读写硬盘上的文件依然是畅通无阻的。也就是多开程序会比较好用吧,指望它把沙盒里的程序与真实系统环境、真实文件系统隔离,看来是做不到的,还是得走虚拟机路线。

Windows Sandbox

有个好消息是,Windows 11 自带了沙盒功能,而且是虚拟机类型的(准确的说是使用了容器技术),与真实系统是隔离的。于是我尝试了 Windows Sandbox,对它比较满意。

需要先在“启用或关闭 Windows 功能”里开启它:

然后系统提示重启,重启后就能用了(。在开始菜单里输入 Windows Sandbox 的部分文字找到它然后启动就可以了。

它的启动速度很快(相对于传统的虚拟机系统来说),只需要三四秒就可以了,会直接进入一个干净的系统桌面。

我把夸克安装到了里面:

这下狗日的夸克终于读取不到我的文档了:

关闭 Windows Sandbox 之后,里面所有的修改都会消失;每次打开 Windows Sandbox 都是一个全新的虚拟系统。

虚拟机进程刚进入桌面时大约使用 1.2 活动内存,当我运行夸克时占用大约 1.4 GB。CPU 使用率只有 10% 或更低,我觉得挺不错。

不过 Windows Sandbox 也有些限制,比如只能开一个,不能多开(我倒没有这个需求)。

映射文件夹

如果不映射文件夹,那么我们在虚拟机里面下载好了文件之后,需要先复制,然后在宿主机里粘贴。

但这样的体验并不好,因为:

  1. 复制的速度非常慢,可能每秒只有十几 MB 速度的样子。一个 2 GB 的文件复制出来需要超过 1 分钟。
  2. 复制过程中,不能再复制别的东西,哪怕是只复制了几个文字,因为这会导致复制失败,报错中断。我据此猜测,复制过程中使用了剪贴板的某些功能,这也可能是复制速度很慢的原因。

我不想忍受这样糟糕的体验,所以我设置了映射文件夹。这个方法是评论区的大佬告诉我的,我们可以为沙盒建立一个配置文件,在里面设置映射的文件夹。
官方文档:Windows 沙盒配置

所谓映射的文件夹,就是在宿主机和沙盒里可以互相访问的同一个文件夹。这样我们在沙盒里下载文件时可以直接下载到宿主机的这个文件夹里,不需要复制粘贴了。

新建一个后缀名为 wsb 的文件,如:

然后在里面进行配置,例如下面的配置可以让宿主机的桌面和沙盒的桌面互相映射:

<Configuration>
    <MappedFolders>
        <MappedFolder>
            <HostFolder>C:\desktop</HostFolder>
            <SandboxFolder>C:\Users\WDAGUtilityAccount\Desktop</SandboxFolder>
            <ReadOnly>False</ReadOnly>
        </MappedFolder>
    </MappedFolders>
</Configuration>

我把这个文件上传了,你可以直接 点击下载

注意:

  1. HostFolder 里是宿主机的桌面文件夹路径,以你的实际路径为准;
  2. 这个配置文件里,每个标签对必须保持在一行,不能换行,否则这个配置是不生效的。

这是正确的:

<HostFolder>C:\desktop</HostFolder>

这是错误的:

<HostFolder>
    C:\desktop
</HostFolder>

保存配置后,双击这个 wsb 文件即可直接启动沙盒,并且可以看到两个系统的桌面是互通的:

在沙盒里下载文件时,选择保存到桌面,这样就可以直接保存到宿主机的桌面上。

使用网络代理的问题

另外是网络问题,如果实机里开了梯子软件,设置了系统的代理服务器(例如):

那么在 Windows Sandbox 里是无法访问网络的:

提示代理错误。一个简单的办法是,先在实机上清除(或关闭)代理服务器设置,然后再启动 Windows Sandbox,这样后者可以正常使用网络(但这样两个系统里都无法翻墙了)。

如果我不想取消实机的代理设置(毕竟实机还是需要翻墙的),该怎么办呢?先看上图的错误提示:代理错误。那么代理出什么问题了?

打开 Windows Sandbox 的系统代理设置一看,好家伙,原来它会同步实机的代理设置。也就是说,在实机里开启或关闭代理服务器,Windows Sandbox 里也会马上同步进行修改。

由于我的代理软件只在实机上运行,所以在 Windows Sandbox 里,代理服务器 127.0.0.1:10809 是无效的,因为 127.0.0.1 是本机 ip,但是 Windows Sandbox 里并没有运行梯子软件(因为它是一个纯净的系统),所以就产生了代理错误。

解决办法是在实机里修改代理服务器的 ip 地址,将其修改为实机在局域网里的 ip 地址,比如我的是 192.168.1.3

稍等一下,Windows Sandbox 里的代理也会同步这个修改,这样它就可以连通实机的代理服务器了,也就可以上网以及翻墙了。

Windows Sandbox 的本机 ip 网段与实机不同,但是可以 ping 通实机。

折腾了下 Sandboxie 和 Windows Sandbox

  1. 萌新
    Google Chrome 126Google Chrome 126WindowsWindows

    之前有差不多这样的需求,所以也认真研究过...
    Sandboxie 并没有隔离,只是通过 hook 的方式,把软件要写入的文件路径重定向到指定的目录,注册表操作拦截之类的方式,防止软件直接修改主系统,但是读取部分是没拦截的,要做完全隔离、限制读取的话,需要高级版。
    Windows Sandbox 是使用 Hyper-V 技术的轻量级虚拟机,只不过不用像单独安装系统那样配置一大堆,即开即用,关闭就丢失。对于这种下载用途,可以写一个配置文件,设置静默安装(打开就会自动安装好软件),路径映射(保存安装好的目录、下载完的文件)会比较方便,其中路径映射特别好用,可以不用下载完又复制出来,不然一不小心关掉了还得重新开始下。
    详细可以参考这篇:https://bbs.letitfly.me/d/1149
    或者微软官方教程:https://learn.microsoft.com/zh-cn/windows/security/application-security/application-isolation/windows-sandbox/windows-sandbox-configure-using-wsb-file
    不过 Windows Sandbox 也有缺点,里面系统是英文环境,某些软件安装可能会不正常;资源管理器(explorer.exe)也经常卡死,如果没做好路径映射的话,卡死就只能关掉重新来了。

    回复