HTTP Server 版本 2.0 API 命名的请求队列功能允许多个应用程序(在单独的进程和用户帐户下运行)访问请求队列。 请求队列按名称打开,并使用访问控制列表(ACL)进行保护,以确保应用程序无法访问彼此的数据。 单个进程创建请求队列,并向其他进程授予使用请求队列的权限。 因此,计算机上的其他进程使用服务请求所需的最低特权访问请求队列。 当应用程序以最低权限运行时,由于第三方代码中的漏洞,HTTP 服务可能会受到损害。
使用 HttpCreateRequestQueue 函数创建命名请求队列。 创建请求队列时,应用程序在 pSecurityAttribute 参数中指定 ACL。 只能在创建请求队列时设置的 ACL 允许工作进程打开请求队列、接收请求和发送响应。 默认情况下,除非进程在 ACL 中被授予权限,否则不允许打开请求队列。 应用程序不需要管理权限来创建请求队列。
必须使用 HttpCreateRequestQueuepName 参数中指定的名称来创建请求队列,以便其他进程打开请求队列。 如果 pNameNULL,则会创建未命名的请求队列,并且无法打开其他进程。
创建者和控制器进程
创建请求队列时,应用程序可以将其作为控制器进程或创建者进程打开。 控制器和创建者都充当请求队列的管理员,但控制器不对其执行 I/O作。 应用程序通过指定 Flags HTTP_CREATE_REQUEST_QUEUE_FLAG_CONTROLLERHttpCreateRequestQueue参数指定请求队列时,它是一个控制器进程。 如果未设置 HTTP_CREATE_REQUEST_QUEUE_FLAG_CONTROLLER 标志,则应用程序是创建者进程。
以下列表包含由控制器进程和创建者进程执行的任务:
- 创建请求队列并指定名称。
- 使用 HttpSetRequestQueueProperty 函数配置请求队列。
- 使用 HttpQueryRequestQueueProperty 函数查询请求队列配置参数。
- 创建 URL 组并将其与请求队列相关联。
- 设置 ACL,指定允许在请求队列上接收 I/O 的工作进程。
- 调用 HttpWaitForDemandStart 延迟工作进程实例化,直到第一个请求到达请求队列。
除了这些任务,创建者进程还可以对请求队列执行 I/O作。
工作进程
仅当辅助进程在 ACL 中被授予对现有请求队列的访问权限时,才能打开现有请求队列。 在最低权限下运行的辅助进程可以打开请求队列并对该队列执行 I/O。 应用程序通过在 Flags 参数中 HTTP_CREATE_REQUEST_QUEUE_FLAG_OPEN_EXISTING 调用 HttpCreateRequestQueue 以及 pName 参数中的请求队列的名称来打开现有请求队列。
工作进程执行以下功能:
- 接收请求并在请求队列上发送响应。
- 按名称打开现有请求队列。 返回到工作进程的请求队列的句柄不能用于配置请求队列。
- 查询请求队列配置参数。
下图显示了请求队列的工作进程模型。 请求队列可以有多个处理 I/O 的工作进程,以及一个配置请求队列的创建者进程。
请求队列工作进程模型