在 Windows 上隔离运行 App:以 BaiduNetDisk 为例

  • Naykcin
  • 7 Minutes
  • June 25, 2020

在 Windows 上隔离运行 App:以 BaiduNetDisk 为例

📍 目录

  • 前言
  • 准备
  • 建立低权限隔离用户
  • 在隔离账户内安装软件
  • 配置软件
  • 准备一个 launcher
  • 隐藏隔离账户
  • 后话

📍 前言

有时 Windows 的锁屏壁纸会被一些流氓 App 恶意修改成广告,所以我们需要采取措施隔离运行它们。常见的思路是给 App 准备一个专门的虚拟机,不过这种方式比较大动干戈,实际上可以用 Windows 的多用户和「以其他用户身份运行」来解决。

这种方式可实现:

📍 准备

首先从 BaiduNetDisk 官方网站下载最新版本的安装包,保存至公用下载文件夹(该文件夹所有用户均可访问,默认路径为 C:\Users\Public\Downloads ),假设待安装程序的文件名称是 BaiduNetdisk_6.8.9.1.exe

为了方便起见,可以在自己账户(假设是 nick )的常用位置(比如桌面或下载文件夹)建立一个指向「公用下载」文件夹的快捷方式。

📍 建立低权限隔离用户

建立一个名为 LowPrivilege 的低权限用户。

Win + R 打开运行 👉🏻 输入 netplwiz 并回车 👉🏻 (如果出现 UAC 窗口,同意或输入管理员密码)点击添加 👉🏻 点击对话框左下角的「不以 Microsoft 账户登录(不推荐)」 👉🏻 再点击本地账户

输入用户名 LowPrivilege 、密码(比如 test )、密码提示,完成即可。

📍 在隔离账户内安装软件

不要通过欢迎界面登录刚才建立的低权限账户,否则会进行很多不必要的初始化从而浪费磁盘空间。进入刚才下载安装程序的目录(按前面的步骤应该是 C:\Users\Public\Downloads\ ),shift + 右键在此处打开 Powershell 窗口,运行如下代码:

# 在弹出的对话框里输入刚才建立的用户名和密码
# 按上述的例子应当是 LowPrivilege 和 test
$cred = Get-Credential

# 执行下列命令用新用户的身份启动 Powershell
Start-Process powershell -ArgumentList '-Command start-Process powershell' -Credential $cred -LoadUserProfile

此时首先会立刻启动一个 Powershell 窗口,但这并不是我们需要的,接着再一次启动的 powershell 才是我们需要的,在这个窗口中(身份为 LowPrivilege )运行命令:

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

# 启动安装程序
.\BaiduNetdisk_6.8.9.1.exe

接着安装程序就会以受限制用户的身份运行,然后极速安装即可。

📍 配置软件

这一步取决于被隔离软件的具体情况。对于 BaiduNetDisk:

如果你安装完成后未打开程序或直接关掉了程序,请先看下一章节。

📍 准备一个 Launcher

我们要做的是每次启动 BaiduNetDisk 时都以低权限账户 LowPrivilege 启动,为了免去输入密码等繁琐的步骤,我们需要写一个启动脚本。

以常用账户(比如 nick)打开一个新的 powershell 窗口,运行如下命令:

# 在弹出的对话框中输入第一步建立的用户名和密码,即 Privilege 和 test
$cred = Get-Credential

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

# 启动 Powershell ISE
ise

在 ISE 中,按下 Ctrl + N ,新建一个 ps1 脚本,粘贴如下代码:

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

# 用 Invode-Item 打开该程序的快捷方式
Start-Process powershell -ArgumentList '-Command Invoke-Item ~\Desktop\百度网盘.lnk' -WorkingDirectory 'C:\' -Credential $cred -LoadUserProfile -WindowStyle Hidden

为了确保代码正确,可以退出 BaiduNetDisk,然后在 ISE 中按下 F5 ,如果没有报错直接启动了 BaiduNetDisk 的话就说明代码正确。

接着 Ctrl + S 保存至自己的用户目录下,比如 C:\Users\nick\Start_Baidunetdisk.ps1 。最后在「文档」文件夹下建立一个新的快捷方式,目标之间写入以下命令:

powershell -ExecutionPolicy Unrestricted -File "C:\Users\nick\Start_Baidunetdisk.ps1"

建立完成后,右键选择 属性 ,在 运行方式 中选择 最小化 ,修改一个合适的图标,修改一个合适的名字,可以固定在任务栏、「开始」屏幕或者在任何方便的地方。

以后点这个快捷方式就可以以低权限隔离账户的身份来运行程序。

📍 隐藏隔离账户

为了减少低权限账户的存在感,可以将其从欢迎页面移除(通过修改注册表)。

Win + R 打开运行 👉🏻 输入 regedit 并回车,在注册表中定位到 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList ,如果没有则需要右键:创建项。

然后在右侧右键,选择新建 DWORD(32位)值 ,命名为 LowPrivilege

这样 LowPrivilege 用户就会从欢迎页面隐藏了,可以注销当前用户来测试是否成功。

📍 后话

有些程序,比如 QQ ,强制需要管理员身份才可以安装,针对这种情况还是虚拟机比较简单。可以尝试在虚拟机进行 App conversion,转换为一个 appx/msix,这样就可以在外层当成 Store 版的 App 安装。(但是程序自动更新的话就会又在本地安装一份,略折腾。)