内核对象命名空间

远程桌面服务服务器为以下命名内核对象提供了多个命名空间:事件、信号量、互斥、可等待计时器、文件映射对象和作业对象。 客户端/服务器应用程序中的服务主要使用全局命名空间。 此外,每个客户端会话都有一个单独的命名空间用于这些对象,例如在 Windows Vista 中。

单独的客户端会话命名空间使多个客户端能够运行相同的应用程序,而不会相互干扰。 对于在客户端会话下启动的进程,系统默认使用会话命名空间。 但是,这些进程可以通过在对象名称前面附加“Global\”前缀来使用全局命名空间。 例如,以下代码调用 CreateEvent 并在全局命名空间中创建名为 CSAPP 的事件对象:

注意

全局命名空间不适用于 Windows 应用商店应用。

 

CreateEvent( NULL, FALSE, FALSE, "Global\\CSAPP" );

默认情况下,远程桌面服务环境中的服务应用程序使用全局命名空间。

会话零仅用于托管服务,并且与以前版本的 Windows 不同,没有控制台会话。

全局命名空间使多个客户端会话上的进程能够与服务应用程序通信。 例如,客户端/服务器应用程序可能会使用互斥对象进行同步。 服务器模块可以在全局命名空间中创建互斥对象。 然后,客户端会话可以使用“Global\”前缀打开互斥对象。

全局命名空间的另一个用途是,对于使用命名对象来检测系统中已跨所有会话运行的应用程序实例的应用程序。 必须在全局命名空间(而不是每个会话命名空间)中创建或打开此命名对象。 默认情况下支持每个会话运行应用程序一次的更常见情况,因为命名对象是在每个会话命名空间中创建的。

除了“Global\”前缀外,客户端进程还可以使用“Local\”前缀在其会话命名空间中显式创建对象。 这些关键字区分大小写。

“Session\”前缀保留供系统使用,不应将其用于内核对象的名称。

使用远程桌面服务会话实现快速用户切换。 第一个登录用户使用会话 1,下一个登录用户使用会话 2,依此。 内核对象名称必须遵循远程桌面服务概述的准则,以便应用程序可以支持多个用户。

使用 CreateFileMapping 从会话 0 以外的会话创建全局命名空间中的文件映射对象是一项特权操作。 因此,在任意远程桌面会话主机 (RD 会话主机) 服务器会话中运行的应用程序必须启用 SeCreateGlobalPrivilege ,才能在全局命名空间中成功创建文件映射对象。 权限检查仅限于创建文件映射对象,不适用于打开现有对象。 例如,如果服务或系统创建文件映射对象,则任何会话中运行的任何进程都可以访问该文件映射对象,前提是用户具有必要的访问权限。