Chris Evans 和 Piero Sierra
Microsoft Corporation
2001 年 3 月
摘要:本文介绍 Microsoft Windows XP 的几项功能,其中包括多用户帐户、快速用户切换和远程桌面。
目录
简介
快速用户切换
远程桌面
要求和结构
新的会话切换消息
确保只运行应用程序的一个版本
系统服务交互
其它问题
简介
无论您是针对 Microsoft® Windows® XP Home Edition 还是针对 Windows XP Professional 编写应用程序,请记住:Windows XP(在 beta 版本中代码名为“Whistler”)是个人系统,即每个计算机用户都将获得一个单独的 Windows XP 帐户。在商务环境中,多个用户可以在同一台计算机上访问各自的电子邮件,而且对各自的文档和设置具有完全访问权。在使用 Home Edition 的家庭中,每个家庭成员都可获得一个单独的帐户。这与 Microsoft Windows 95 和 Windows 98 有所不同,因为在原有的这两种系统中,家庭的所有成员通常要共用一个帐户。
用户最好在设置过程中创建这些帐户,但也可在稍后使用“控制面板”来创建这些帐户。这些帐户基于 Windows 2000 配置文件,这意味着每个用户的数据是相互分隔的。默认情况下,这些帐户不受密码保护,但用户可以选择设置帐户的密码。
如果计算机上存在多个帐户,则将显示“欢迎”屏幕。在“欢迎”屏幕上,每个用户都将获得一个单独的图形,通过单击该图形即可登录到计算机。
快速用户切换
Windows XP 推出了快速用户切换功能。在 Windows XP 中,当其它用户要访问其帐户时,当前用户不必从计算机上注销。相反,用户帐户可以始终保持登录状态,并且多个用户可以在所有打开的帐户之间进行快速切换。在一台计算机上可以同时打开多个帐户。
例如,父亲回家后,开始使用他的计算机。他打开 Microsoft® PowerPoint®,开始处理一个文档。这时,儿子 Billy 走过来,也要使用计算机。Billy 转到“欢迎”屏幕,通过单击 Billy 图形登录到计算机,然后开始玩游戏。而此时父亲仍未注销。如果需要,父亲还可以回来切换到他已经打开的帐户,并且无需让 Billy 注销。父亲的 PowerPoint 演示文档仍处于打开状态,他的 Internet 连接也未断开。
在商务环境中,如果父亲需要快速地完成工作,他就可以通过用户切换很容易地与同事在不同班次共用同一台计算机,即使他们的班次出现重叠。
远程桌面访问
Windows XP 还具有远程桌面功能,它使用户能够从其它计算机访问数据和应用程序。在商务工作站上,Windows XP 使用户能够从远程计算机访问其桌面。
例如,母亲可以锁定办公室的工作站,回家后再连接到办公室工作站。家用计算机可以从远程控制办公室工作站上运行的应用程序。当母亲又回到办公室后,她可以解除桌面锁定,然后继续完成离开家时未做完的工作。
再比如,您在旅行途中要处理多个销售帐户,并且要检查您存放在办公室计算机“我的文档”文件夹中的合同文本。您在公司的一家分支机构停下来,借了一台计算机。无需让该计算机的当前用户注销,您就可以打开自己的帐户(包括您的所有文档和设置)并找到所需的合同。
要求和结构
快速用户切换和远程桌面都使用终端服务技术,无需进行任何更改,它们就可用于大多数较早期版本的 Microsoft® Win32® 应用程序。Windows XP 并不需要为用户切换编写新代码,而只需要编写好的代码。如果您的应用程序经过了 Windows 2000 应用程序认证程序的认证,并且您实现了基本的配置文件分隔和电源管理功能,该应用程序就应该能够在 Windows XP 中正常运行。
注意:利用几种新消息,您可以在 Windows XP 系统中更好地运行您的应用程序。这些消息将在本文后面进行介绍。
Windows 2000 提供的基础结构包含在 Windows XP 的所有版本(包括 Professional 版本和 Home client 版本)中。该结构支持对用户数据、用户设置和计算机设置进行状态分隔。正确使用该结构的应用程序将提供以下益处:
- 用户可以方便地对单独的文档和设置进行备份,而无需备份应用程序和操作系统文件。
- 如上所述,多个用户可以共用同一台计算机并保持各自的首选项和设置。
- 另外,一个用户还可以使用多台计算机,并可从一台计算机对另一台计算机的文档和设置进行维护。
其要求相当简单,您只需:
- 默认为在“我的文档”文件夹中存储用户创建的数据。
- 正确分类和存储应用程序数据。
- 减少“访问被拒绝”的提示。
新的会话切换消息
通常,当进行会话切换时,无需通知应用程序。然而,如果应用程序需要了解桌面处于当前状态的时间,则可注册会话切换通知。如果应用程序访问计算机上的串行端口或其它共享资源,则应选中此功能。要注册通知,请使用 Wtsapi32.h 中的以下函数:
BOOL WINAPI
WTSRegisterConsoleNotification(
HWND hWnd, // Window 句柄
DWORD dwFlags // 标志
);
已注册的 HWND 会接收消息 WM_WTSSESSION_CHANGE
在 dwFlags 中,您可以指定:
NOTIFY_FOR_THIS_SESSION - 仅向窗口通知将影响其所属会话的会话更改事件。
NOTIFY_FOR_ALL_SESSIONS - 向窗口通知所有会话更改事件。
在 wParam 代码中可找到此会话的操作,该代码中可能包含以下标志之一:
WTS_CONSOLE_CONNECT
WTS_CONSOLE_DISCONNECT
WTS_REMOTE_CONNECT
WTS_REMOTE_DISCONNECT
lParam 包含所影响会话的会话 Id。
如果您的进程不再需要这些通知或者即将终止,则应调用以下函数来取消其通知注册。
BOOL WINAPI
WTSUnRegisterConsoleNotification(
HWND hWnd // window 句柄。
);
传递给 WTSRegisterConsoleNotification 的 HWND 值是以引用计数的,因此必须以调用 WTSRegisterConsoleNotification 的相同次数来调用 WTSRegisterConsoleNotification。
应用程序可以使用 WM_WTSSESSION_CHANGE 消息来跟踪其状态,并释放或获得特定于控制台的资源。
确保只运行应用程序的一个版本
对于许多应用程序,必须确保只运行该应用程序的一个例程。在 Windows XP 中,有多种方法可实现此目的。
- 使用 FindWindow 或 FindWindowEx 来搜索应用程序打开的窗口。如果该窗口已打开,则使用 FindWindow 或 FindWindowEx 来确定该应用程序已打开。
- 当打开应用程序时,请创建一个互斥标志或信号,然后在应用程序退出时将其关闭。全局对象名称空间将针对每个桌面进行分隔,以产生唯一的互斥标志及信号列表。
系统服务交互
从编程的角度来看,需要分两种情况来讨论。
- 服务器进程接收到客户机进程的直接请求。
在这种情况下,可能会通过 LPC 或 RPC 传送消息。无论是通过 LPC 还是 RPC,都由 API 来获取客户端令牌。一旦获得客户端令牌,服务器就可调用 advapi32!CreateProcessAsUser。假设客户端用户令牌具有会话标记(应该如此),则将在正确的窗口站调用进程。
注意:advapi32!CreateProcessAsUser 当前不支持各会话间的句柄继承。
- 服务器进程接收到某种形式的通知,需要显示用户界面,但它不必位于当前用户的环境中。
在这种情况下,服务器进程可以复制其主进程令牌,并将会话标识符更改为当前的会话标识符。要检索控制台上当前会话的会话 ID,请使用公共 API WTSGetActiveConsoleSessionID()。
注意:为了设置令牌会话 ID,您需要具有 SE_TCB_PRIVILEGE。它只能作为在 NT AUTHORITY/SYSTEM 中运行的服务来拥有。
其它问题
不要在非特定于用户配置文件的中心位置(如 Windows 目录)创建映射文件。临时文件、内存映射文件和文档都应存储在用户配置文件目录的相应子目录中。您可以使用 SHGetFolderLocation 或 SHGetFolderPath 来查找相应的文件存储位置。如果将 CSIDL_APPDATA 传递给应用程序,则会返回文件系统目录,该目录用作特定于应用程序的数据的公用存储库。应该将 CSIDL_LOCAL_APPDATA 用于随用户的更改而更改的数据,如临时文件。
当添加远程桌面功能后,应用程序不得使用超出需要的带宽。当桌面进行远程连接时,应用程序应避免使用大量的屏幕绘图和动画效果。用户桌面可以在远程和控制台间动态地进行切换。应用程序应使用上述的 WM_WTSSESSION_CHANGE 消息来进行远程与本地连接状态的同步。