内核对象命名空间

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

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

注意

全局命名空间不适用于Windows Microsoft Store应用。

 

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

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

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

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

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

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

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

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

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