实际上这个功能 Windows 一直都支持,只是没有推广给普通用户。我想在这里解释一下。这篇文章并不是 blog 推广,因为我没有就该主题写一篇 blog entry。
要理解这个概念,首先需要理解 session、window station、desktop、process、window 之间的关系。
- 一个 session 和一个 登录用户 关联,每当你从欢迎屏幕或者远程桌面连接登录,你就创建了一个新的 session。每个 process 都从属于一个 session。每个 session 还有自己的 USER 句柄表。
- 一个 window station 属于一个 session,一个 session 默认有且只有一个 window station,叫做
WinSta0,这是惟一可显示 UI 的 window station。每个 window station 有 惟一的剪贴板。 - 一个 desktop 属于一个 window station,一个 window station 默认有且只有一个 desktop,同一时间 有且只有一个 desktop 可以显示在屏幕上,但可以用
SwitchDesktop切换当前显示的 desktop。 - 一个 window 属于一个 desktop。
- 一个 process 可以在自己的 session 的不同 window station 之间移动;一个 thread 可以在自己进程当前的 window station 的不同 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 ; - session 1 里面建立了
WinSta0,里面建立了默认的 desktop ; - 在我的 session 里面启动了 Windows Shell ;
- 我在我的 session 里面提供了
BaiduPan账户的凭据,启动了它的百度云管家。
结果:百度云管家以 BaiduPan 的身份在 GL 的 session、WinSta0 里的默认 desktop 里运行。
因为剪贴板是 window station 级别的对象,因此我可以从自己身份的浏览器复制,并粘贴进百度云。
查看我转发的 LiveSino 的视频和极力压缩到 140 字的解析
在上面这个视频里,我们可以想象它是如此实现的:
- 系统自动用一个中性账户登录(产生了中性账户的 session ),比如这个中性账户可以是
Guest,或一个没有任何特定人资料访问权限的非管理员。 - 当用户通过指纹提供了自己的凭据,Windows 就以该用户的身份启动 Windows Shell (这里就是一个“最近文件启动器”)。
- 用户在启动器里面选择文件,启动器处于
Guest的默认 desktop 里,进程所在的 desktop 默认是继承的,所以 Excel 仍然在这个 desktop 启动;进程的身份是继承进程的,所以启动器启动的 Excel 是提供了指纹的用户,因此可以访问那个用户的文档。 - 下一个用户通过指纹提供了自己的凭据,于是下一个用户身份的启动器出现,于是打开了下一个用户的 PowerPoint。
- Excel 和 PowerPoint 处于同一个 window station (因为在同一个 desktop ),所以可以从一个程序复制、在另一个程序粘贴。
实际上,目前这些步骤本来就可以用桌面版本的 Excel、PowerPoint 实现。但是由于目前 UWP model 实现方式的原因,无法在 A 用户的 session 里以 B 用户的身份启动 UWP。从这个视频看,是新的实现允许了这件事情。