1 月中旬,微博博主 @张欣Kenn 所使用的 Windows 电脑锁屏变成了「百度云」的广告。此事在微博上引发了一些声音,一开始大家觉得是百度云管家乱搞,后来却发现是联想的 OEM 「后门」作祟。

图源见水印,相关微博已删除

国内用户对此类事件已是见怪不怪,在 知乎 上我们就能看见不少抱怨 Chrome 被国产应用和插件莫名「接管」的案例。而在国内的大环境下,完全避免使用某些软件和服务也不太现实,为其专门建立一个虚拟机或使用沙盒软件作为隔离又显得大材小用。

有没有什么办法可以改善这个状况呢?我们平时忽视的「用户」体系在 Windows 7 之后设计趋为完善,再配合 ACL 权限工具就能把这些软件安排得「明明白白」。

ACL 与应用隔离

Windows 7 之后,微软开始陆续向 Windows 系统添加安全特性,原本用于 Windows Server 文件安全的 ACL 就是其中之一。

ACL 全称 Access Control List,Wikipedia 上对 ACL 的描述是:

ACL 是对象(文件、文件夹等)上所附加权限的一个清单,它可以指定哪个用户或系统进程可以访问某个对象,以及后续可以在对象上做什么操作。

因此在 Windows 上,我们可以使用基于 ACL 与 NTFS 分区格式中的主体权限(大家在文件/文件夹「属性」中可能已经见过的「组」与「用户」)来对那些不得不用的毒瘤应用进行隔离:当用户是「受限用户」时,该用户在默认情况下不能访问、修改系统与其他用户的文件,或修改当前用户的设置

所以本方法的核心理念就是创建一个受限用户来安装、运行毒瘤应用,将那些可能会对系统设置和系统文件进行恶意修改的行为锁定在受限用户当中。换句话说,利用此特性我们可以给不老实的软件圈出一块地。这种方法有这些好处:

  • 不需要切换用户或开关虚拟机,隔离成本低

  • 被隔离的应用只能读写公共可读写的位置和隔离账户的资料库

  • 被隔离的应用只能修改被隔离账户的设置

  • 允许被隔离应用使用剪贴板等会话级别对象

用这个方法运行软件就像小朋友在零售店里玩展示机一样,手机系统内有软限制,旁边又有店员看着。这种限制介于完全放开与完全封闭之间,虽然不能限制死,对于该场景来说却是一个较好的解决方案。

值得一提的是,该方法与在沙箱中运行应用的安全性不在同一个级别,安全领域也有各种隐秘方法可以进行 ACL 渗透提权,请不要使用该方法运行任何有害软件(和「流氓应用」还是要注意区分);未来本方法也可能因为应用本身的更新而失效。

另外,该方法较为复杂,不适合 Windows 零基础用户操作。

准备工作

首先你需要下载被限制软件的安装包并放到一个「公共」位置。注意:公共位置意味着新文件从父文件夹继承的权限对 User 组至少有「读取」与「执行」权限。通常以下几个位置满足该条件:

  • C:\Users\Public\Downloads(可能显示为:C:\用户\公用\公用下载)
  • 非 C 盘的其他盘符根目录

建立账户

建立一个账户来安装软件,在本例中,我们使用 IsolatedApps 作为账户名。在此场景下,使用「控制面板」的组件建立用户最为方便:

  1. 使用 Win+R 快捷键调出「运行」窗口,输入 netplwiz 并按回车运行。
  2. 点击「添加」按钮,在新出现的蓝色对话框中点击「不使用 Microsoft 账户登录 > 本地账户」
  3. 输入用户名、密码(可以是你容易输入的密码或是随机强密码)、密码提示,点击完成。

此时你的「用户账户」对话框应该看起来像这样:

注意:请确保 IsolatedApps 用户只属于 Users 组。

安装软件

到这个时候新账户就建立好了,但请注意不要通过账户登录界面切换到该用户并安装软件!这会制造一些不必要的数据并占用一部分空间。

依然使用 Win+R 快捷键调出「运行」窗口,输入并执行 powershell 。在新打开的窗口(我们称之为窗口 1)中输入 $cred = Get-Credential 并回车,然后在弹出的窗口中输入用户名 IsolatedApps 及你刚才设置的密码并点击确认。

然后在窗口 1 中继续输入:

Start-Process powershell -ArgumentList '-Command Start-Process powershell' -Credential $cred -LoadUserProfile

回车确认,这一步是为了使用新建立的用户打开命令窗口。等待命令完全执行(期间会闪过一个窗口并自动关闭)后会出现一个新的 PowerShell 窗口,我们称之为窗口 2

窗口 2 就是我们需要的窗口,下面的操作在窗口 2 中进行:

  1. 在窗口中输入:$env:__COMPAT_LAYER = 'RunAsInvoker' 并回车。
  2. 为了确保我们是在隔离用户之下,输入 cd ~ 进入主目录。此时,左边的光标提示符应该变为 C:\Users\IsolatedApps
  3. 在窗口中输入一个英文的引号,即 & '软件包路径',回车即可打开安装界面。此时按照普通方式安装即可。

注意:由于 Windows 10 新特性会将非特权用户所安装的软件放在隔离区内,若安装失败,请将软件安装路径放在其他公共读写区域(如其他盘符或 Public 文件夹)。

准备启动器

通过上面的步骤完成软件安装后请不要关闭,在窗口 2 中接着输入:

cd ~/Desktop
ls

此时可能会出现两种情况:

  • 情况一,返回非空白(即出现已安装的软件名),则记下出现的文件名(通常以 .lnk 结尾);
  • 情况二,返回为空白,此时按 Ctrl + Shift + Esc 打开任务管理器,切换到「详细信息」,并按照「用户名」排列,找到使用 IsolatedApps 用户运行的软件,记下文件名1

使用 Everything 或文件索引搜索上面记下的文件名,点击右键,选择「复制完整路径和文件名」,复制下来的字符应该像是 D:\AliWangWang\AliIM.exe

请注意,受非酋体质制约,该步骤可能需要重复多次。

接下来,关闭所有 PowerShell 窗口,然后重新开启一个新的 PowerShell 窗口:

注:如非特别说明,下文中「#」后面文字内容为注释内容,用于理解,无需执行。

# 在弹出的对话框里输入刚建立的用户的用户名和密码
$cred = Get-Credential

# 安全地保存密码并复制到剪贴板
$cred.Password | ConvertFrom-SecureString | Set-Clipboard

# 启动 PowerShell ISE
ise

接着打开 PowerShell ISE,按 Ctrl + N,先将刚才已经复制的加密字符串粘贴在第一行,然后按照以下步骤操作:

# 选中 ... 并粘贴,这样就会得到安全存储的密码
# 粘贴结果应该是一长串十六进制数,请注意单引号里应该没有空格
$password = '...'

# 将下面的 ... 修改为你建立的用户名
# 若此步骤出现问题,请检查密码字符串是否在日常需要运行该软件的账户下生成
$cred = [pscredential]::new('...', ($password | ConvertTo-SecureString))

# 不同软件这里的命令不同
# 这里是用 Invoke-Item 打开快捷方式,即在上文中输出非空白的情况(第一种)
# 选中 ... 并替换为刚才看到的软件名(以 .lnk 结尾)
Start-Process powershell -ArgumentList '-Command Invoke-Item ~\Desktop\...' -WorkingDirectory 'C:\' -Credential $cred -LoadUserProfile -WindowStyle Hidden

# 如果是返回空白的情况(第二种),则使用以下命令
# 选中 ... 并粘贴刚才找到的 exe 完整路径及文件名
Start-Process powershell -ArgumentList '-Command Start-Process ...' -Credential $cred -LoadUserProfile -WindowStyle Hidden

为了确保操作正确,可以进行测试:退出目标软件,再在 ISE 里按 F5

  • 如果什么没有报错就直接启动了目标软件,则说明代码正确;
  • 若 ISE 下方窗口出现错误,则可能是代码部分有误,请仔细检查;
  • 若 ISE 下方窗口未报错但未出现程序 / 程序报错,一般是 exe 文件找错了,可以参照上面的办法再找找。

代码确定正确后,把它保存在自己的用户目录下,比如在 C:\Users\sunse\Start-Aliwangwang.ps1

最后,在任意位置建立新快捷方式,目标写:

powershell -ExecutionPolicy Unrestricted -File "C:\Users\sunse\Start-Aliwangwang.ps1"

建立好之后右键,选属性,「快捷方式」下的「运行方式」选最小化,并改一个合适的图标。最后改一个合适的名字,并固定到任务栏、开始屏幕或者放在任何方便的地方。

以后点这个快捷方式即可以隔离账户的身份运行该软件。

隐藏特殊账户

如果你是一个强迫症,不希望在欢迎屏幕看到这个隔离账户;在更理想的条件下,你应该针对每个软件新建一个账户,如此多的用户列表会显得「脏、乱、差」。这时可以通过编辑注册表把它隐藏:

新建文件,名为 Hide-IsolatedUsers.reg,输入以下内容,并将 ... 替换为你实际建立的用户名称:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList]
"..."=dword:00000000

保存,双击导入,这样特殊账户就会从欢迎屏幕隐藏。

检验及缺陷

在完成所有工作后,出于权限考虑,建议你先重启电脑。重启后我们可以打开软件检验一下隔离的效果。

运行应用

打开软件,软件正常启动,相关进程在隔离用户下运行。

提权操作

所有提权操作需要输入管理员密码。

开机启动

设置为开机启动,但是在本用户下并不能生效。

解释:右边的启动项已经按照发布者排序,旺旺的发布者应该是 Alibaba Software (Shanghai),但右边发布者已经排序到 B 还未出现。

访问宿主用户文件

访问宿主用户文件将需要授权;对系统文件默认只有读取权限,没有写入权限。

其它

托盘功能正常,使用时可能有小卡顿。

小结:沙盒 vs. ACL?

至此,我们便完成了借助 Windows 自带的用户/用户组和 ACL 权限管理工具进行毒瘤应用隔离的全部操作,不难看出,这种方法与 Windows 10 在 2019 年 5 月更新中加入的 原生沙盒 功能殊途同归。

那我们究竟该选择哪一种?

如果你仅仅是出于临时需求,偶尔用到一些不太让人放心的毒瘤应用,Windows 10 的沙盒功能简单易用,用完即走,是更好的选择;但如果你需要长时间在系统中安装一些不那么安分的应用,每次使用完毕后都会清除数据的原生沙盒就显得有些麻烦了,这时本文介绍的方法虽然有一定的上手门槛,配置完成后使用起来要更加方便。

Windows 原生沙盒

最后,和 Windows 10 原生沙盒仅适用于专业版/企业版用户一样,本文介绍的方法也有其适用范围:如果你的设备为企业设备,拥有权限等级更高的系统管理员,本方法中涉及到的大部分提权操作是无法执行的。

参考来源

本文方法参考自 @geelaw 的博客,本文经授权发表。

> 下载少数派 客户端、关注 少数派公众号 ,发现更多实用 Windows 技巧 🆒

> 年度回顾、好物推荐……更多精彩尽在 少数派 2019 年度盘点 🎉