实际上这个功能 Windows 一直都支持,只是没有推广给普通用户。我想在这里解释一下。这篇文章并不是 blog 推广,因为我没有就该主题写一篇 blog entry。
要理解这个概念,首先需要理解 session、window station、desktop、process、window 之间的关系。
WinSta0
,这是惟一可显示 UI 的 window station。每个 window station 有 惟一的剪贴板。SwitchDesktop
切换当前显示的 desktop。为什么需要 window station 和 desktop 这样的设计呢?因为 USER 对象(例如 window 是 USER 对象)是不能设置 ACL 的;如果没有 window station 和 desktop 的抽象,一个 session 内的进程可以随便访问该 session 里的 window (包括发送恶意消息)。使用 window station 和 desktop 可以对 window 提供一些保护,因为任何线程都无法直接发送消息到不同 desktop 上的 window,而 window station 和 desktop 本身是有 ACL 的,因此没有足够权限的进程是没法访问受保护的 window station、desktop 上的 window 的。
说了这么多,我们来举个例子,说明“同时用两个用户”是怎么实现的。我自己偶尔要用百度云管家,但是我不希望这个软件污染我的电脑。我平常用账户 GL
,然后我创建了一个非管理员账户 BaiduPan
,接着在 BaiduYun
里面(单用户模式)安装百度云管家。以后每当我需要用百度云管家的时候,我就在我的 session 下以 BaiduPan
的身份启动百度云管家(当然这是有脚本自动化的)。说得简单一些就是**“以其他用户运行程序”**。
现在用上面的术语描述一下使用电脑的过程,就是:
GL
,创建了一个 session,比如叫 session 1 ;WinSta0
,里面建立了默认的 desktop ;BaiduPan
账户的凭据,启动了它的百度云管家。结果:百度云管家以 BaiduPan
的身份在 GL
的 session、WinSta0
里的默认 desktop 里运行。
因为剪贴板是 window station 级别的对象,因此我可以从自己身份的浏览器复制,并粘贴进百度云。
在上面这个视频里,我们可以想象它是如此实现的:
Guest
,或一个没有任何特定人资料访问权限的非管理员。Guest
的默认 desktop 里,进程所在的 desktop 默认是继承的,所以 Excel 仍然在这个 desktop 启动;进程的身份是继承进程的,所以启动器启动的 Excel 是提供了指纹的用户,因此可以访问那个用户的文档。实际上,目前这些步骤本来就可以用桌面版本的 Excel、PowerPoint 实现。但是由于目前 UWP model 实现方式的原因,无法在 A 用户的 session 里以 B 用户的身份启动 UWP。从这个视频看,是新的实现允许了这件事情。