内核对象命名空间

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

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

CreateEventW( NULL, FALSE, FALSE, L"Global\\CSAPP" );

服务应用程序默认使用全局命名空间。

注意

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

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

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

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

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

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

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

在全局命名空间中创建文件映射对象或符号链接对象(例如,通过使用 CreateFileMapping),从会话零以外的会话创建是特权作。 因此,应用程序必须启用 SeCreateGlobalPrivilege 才能在全局命名空间中创建文件映射对象或符号链接对象。 特权检查仅限于创建这些对象,不适用于打开现有对象。 例如,如果服务或系统在全局命名空间中创建文件映射对象,则任何会话中运行的任何进程都可以访问该文件映射对象,前提是进程具有必要的访问权限。