在 Windows 上隔离 app:以百度云管家为例

本文由 SunsetYe 演绎后发布于 少数派,他的例子是阿里旺旺。

来自 @张欣丨Kenn 的微博
来自 @张欣丨Kenn 的微博

最近有网友发现自己的 Windows 锁屏壁纸被修改成了百度云管家的广告。(一开始大家觉得是百度云管家乱搞,后来发现 实际上是 联想的 OEM 软件乱搞。)无论怎样,这说明一些软件用正常方式运行总让人不够放心,采取措施隔离一些 app 很有必要。一些网友 提出可以给 app 准备一个专门的虚拟机,不过这有点大炮打蚊子了,其实可以用 Windows 的多用户和“以其他用户身份运行”解决。这个方法适用于很多 Windows 桌面 app。

这个技巧有诸多好处:

  • 防止被隔离的 app 随意读写日常账户的内容——它只能读写公共可读写的位置和隔离账户的资料库。
  • 防止被隔离的 app 随意修改日常账户的设置——它只能修改隔离账户的设置。
  • 允许被隔离 app 使用剪贴板等会话级别对象。
  • 不需要切换用户、开关虚拟机,隔离成本低。

选百度云管家为例子主要有四个原因:一是它正好是我看到的微博的舆论焦点;二是我自己也不信任它,日常就是隔离使用的;三是它可以隔离使用;四是它需要一点点小技巧。废话不多说,进入正题。

第一步:准备安装程序

这一步就是从 百度云管家的网站 下载最新版本的安装包。下载后保存到一个所有人都可以访问的位置,例如公共“下载”文件夹(默认位置是 C:\Users\Public\Downloads*)。这里假设安装程序的名字是 BaiduNetdisk_6.8.9.1.exe

在做这一步时可以顺便在自己常用的位置(例如自己的“下载”文件夹或者自己的桌面)建立指向公共“下载”文件夹的快捷方式。假设自己的用户名是 GL

第二步:建立隔离用户账户

建立一个名为 BaiduPan 的受限用户并设置一个密码。这一步有很多种做法:控制面板、“设置”app、lusrmgr.msc、PowerShell。例如用古早味控制面板:

  1. 在 Cortana 中输入 netplwiz 并运行。如果出现 UAC 窗口,同意或者输入管理员密码。
  2. Add… 添加一个账户,在对话框里点左下角的 Sign in without a Microsoft account (not recommended),再点 Local account
  3. 输入用户名 BaiduPan、密码(比如 A=LoX4a86rTcSQd\)、密码提示,点 Finish

第三步:在隔离账户内安装软件

为了节约磁盘空间,永远不要通过欢迎屏幕登录刚刚建立的隔离账户(通过欢迎屏幕登录会进行很多不必要的初始化)。首先转到刚刚保存安装程序的位置,然后在文件资源管理器里点 File > Open PowerShell,再在里面运行如下代码:

# 在弹出的对话框里输入刚建立的用户的用户名和密码
# 例子里就是 BaiduPan 和 A=LoX4a86rTcSQd\
$cred = Get-Credential

# 用新用户的身份启动 PowerShell
Start-Process powershell -ArgumentList '-Command Start-Process powershell' -Credential $cred -LoadUserProfile

注意立刻启动的 PowerShell 并不是我们需要的§,它会“多余地”再启动一次 PowerShell,因此在蓝色窗口闪过之后再出现的蓝色窗口才是我们需要的。在新启动的 PowerShell 里运行如下命令:

# 不要尝试提权
$env:__COMPAT_LAYER = 'RunAsInvoker'

# 下面一行取决于安装程序的名字
.\BaiduNetdisk_6.8.9.1.exe

这时安装程序就会以新建的受限用户身份运行,阅读许可协议并同意后点击“极速安装”即可。

第四步:配置软件

这一步取决于具体被隔离的软件。安装完成后百度云管家会启动,这时我会做如下操作:

  1. 登录百度云管家,并允许记住密码和自动登录。
  2. 修改默认下载路径为公共“下载”文件夹。
  3. 关闭客户端锁定的功能。
  4. 关闭“插入设备后,提示备份照片”功能。

如果你直接关掉了百度云管家,先去看第五步,完成后即可启动百度云管家并进行日常操作。

第五步:准备启动器

每次启动百度云管家的时候都必须以 BaiduPan 隔离账户的身份启动,为了免去输入密码等麻烦,可以准备一个脚本完成百度盘的启动。

回到你日常账户身份的 PowerShell 窗口(如果你无法确认哪个窗口是日常账户的身份,可以关掉所有 PowerShell 窗口然后开一个新的),并运行如下命令:

# 在弹出的对话框里输入刚建立的用户的用户名和密码
# 例子里就是 BaiduPan 和 A=LoX4a86rTcSQd\
$cred = Get-Credential

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

# 启动 PowerShell ISE
ise

在 ISE 里按 Ctrl+N,粘贴如下代码并按照注释里操作:

# 选中 ... 并粘贴,这样就会得到安全存储的密码
# 粘贴结果应该是一长串十六进制数
$password = '...'
$cred = [pscredential]::new('BaiduPan', ($password | ConvertTo-SecureString))

# 不同软件这里的命令不同
# 这里是用 Invoke-Item 打开百度云管家的快捷方式
Start-Process powershell -ArgumentList '-Command Invoke-Item ~\Desktop\百度网盘.lnk' -WorkingDirectory 'C:\' -Credential $cred -LoadUserProfile -WindowStyle Hidden

为了确保操作正确,可以进行测试:退出百度云管家,再在 ISE 里按 F5,如果什么都没有提示就直接启动了百度云管家,则说明代码正确。

代码确定正确后,把它保存在自己的用户目录下,比如叫 C:\Users\GL\Start-BaiduNetdisk.ps1。最后,在“文档”下建立新快捷方式,目标写:

powershell -ExecutionPolicy Unrestricted -File "%USERPROFILE%\Start-BaiduNetdisk.ps1"

建立好之后右键,选 Properties,在 Run 下拉列表里选 Minimized(以最小化窗口启动快捷方式),并改一个合适的图标。最后改一个合适的名字,并固定到任务栏、“开始”屏幕或者放在任何方便的地方。以后点这个快捷方式即可以隔离账户的身份运行百度云管家。

第六步:隐藏隔离账户

有些强迫症(比如我)不希望在欢迎屏幕看到这个隔离账户,主要是这种隔离账户多了还会弄得很乱。这时可以通过编辑注册表把它隐藏:

  1. 在 Cortana 里搜索 regedit 并以管理员身份运行它。
  2. 定位到 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList 键(如果没有则需要创建)。
  3. 在右侧右键,新建 DWORD 值,并起名为 BaiduPan

这样 BaiduPan 用户就会从欢迎屏幕隐藏。

注解

* 该文件夹在不同语言的 Windows 上显示名称不同,但任意语言里直接粘贴地址到地址栏均可直达。
自己生成一个随机密码,不要真的用这个密码。
似乎 Windows 10 这个版本的新建账户向导要求必须输入密码提示,随便写一个没有意义的内容即可。
§ 这似乎是 Windows 的一个 bug,如果不进行多余的“再启动”,直接启动的窗口不能接受键盘输入,或者需要等很久才能接受键盘输入。
这就是我之前说的“需要的小技巧”。默认情况下,百度云管家无法不提权运行(我不知道是 Windows 的安全程序检测导致的还是安装程序本身的 manifest 导致的,懒得研究),我们需要通过环境变量控制兼容性设置,从而让 Windows 忽略一切判定直接以 BaiduPan 受限用户的身份运行安装程序。

请启用 JavaScript 来查看由 Disqus 驱动的评论。