设置 ACL,指定允许在请求队列上接收 I/O 的工作进程
Set the ACL specifying the worker processes that are allowed to receive I/O on the request queue
我正在使用WinHTTP Server API 2.0,我正在尝试以下步骤(https://msdn.microsoft.com/en-us/library/windows/desktop/aa364672(v=vs.85).aspx):
- 创建请求队列并指定名称。
- 使用
HttpSetRequestQueueProperty
函数配置请求队列。 - 使用
HttpQueryRequestQueueProperty
函数查询请求队列配置参数。 - 创建 URL 组并将其与请求队列关联。
- 设置 ACL,指定允许在请求队列上接收 I/O 的工作进程。
- 调用
HttpWaitForDemandStart
以延迟工作进程的实例化,直到第一个请求到达请求队列。
任何人都可以帮助步骤:
设置 ACL,指定允许在请求队列上接收 I/O 的工作进程
我不确定这到底是什么意思(我从未使用过 ACL API),但我认为我需要在某个时间点调用::GetNamedSecurityInfo()
来修改它:
if (NO_ERROR == ::HttpCreateRequestQueue(HTTPAPI_VERSION_2,
requestQueueName,
0,
HTTP_CREATE_REQUEST_QUEUE_FLAG_CONTROLLER,
&m_requestQueue))
// setup queue
if (NO_ERROR == ::HttpCreateUrlGroup(m_sessionId, &m_groupId, 0))
{
HTTP_BINDING_INFO bindingInfo{ 1, m_requestQueue };
if (NO_ERROR == ::HttpSetUrlGroupProperty(m_groupId,
HttpServerBindingProperty,
&bindingInfo,
sizeof(bindingInfo)))
{
m_localUrl = (NO_ERROR == (::HttpAddUrlToUrlGroup(m_groupId, localUrl.c_str(), 0, 0)));
m_globalUrl = (NO_ERROR == (::HttpAddUrlToUrlGroup(m_groupId, globalUrl.c_str(), 0, 0)));
PACL pacl = NULL;
PSECURITY_DESCRIPTOR securityDescriptor = NULL;
DWORD result = ::GetNamedSecurityInfo(requestQueueName,
SE_KERNEL_OBJECT,
SACL_SECURITY_INFORMATION,
NULL,
NULL,
NULL,
&pacl,
&securityDescriptor);
// it (result != 0) fails when passing various SE_OBJECT_TYPEs
}
}
设置 ACL,指定允许的工作进程 在请求队列上接收 I/O
寻找其他一个注释:
命名请求队列是使用HttpCreateRequestQueue函数创建的。创建请求队列时,应用程序指定pSecurityAttribute参数中的 ACL。ACL,它只能 在创建请求队列时设置,允许工作进程 打开请求队列、接收请求和发送响应。由 默认情况下,不允许进程打开请求队列,除非它们 已在 ACL 中被授予权限。申请不需要 创建请求队列的管理权限。
所以实际上你可以(但不是必须的,这是可选的)创建和初始化一些安全描述符,并通过In_opt_ PSECURITY_ATTRIBUTES pSecurityAttributes
将其传递给 HttpCreateRequestQueue 函数 - 这里绝对没有什么特别的,任何内核对象中使用的SECURITY_ATTRIBUTES
创建 API。 例如,CreateEvent
(这里是第一个参数)。
如何初始化它,为谁授予访问权限 - 这已经是一个悬而未决的问题 - 边界案例 - 允许所有人这样做:
ULONG cb = MAX_SID_SIZE;
PSID UntrustedLabelSid = (PSID)alloca(MAX_SID_SIZE);
if (CreateWellKnownSid(WinUntrustedLabelSid, 0, UntrustedLabelSid, &cb))
{
PACL Sacl = (PACL)alloca(cb += sizeof(ACL) + sizeof(ACE_HEADER) + sizeof(ACCESS_MASK));
InitializeAcl(Sacl, cb, ACL_REVISION);
if (AddMandatoryAce(Sacl, ACL_REVISION, 0, 0, UntrustedLabelSid))
{
SECURITY_DESCRIPTOR sd;
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE);
SetSecurityDescriptorSacl(&sd, TRUE, Sacl, FALSE);
SECURITY_ATTRIBUTES sa = { sizeof(sa), &sd, FALSE };
if (NO_ERROR == HttpCreateRequestQueue(HTTPAPI_VERSION_2,
requestQueueName,
&sa,
HTTP_CREATE_REQUEST_QUEUE_FLAG_CONTROLLER,
&m_requestQueue))
{
}
}
}
作为替代方案,我们可以使用字符串格式的安全描述符,然后使用ConvertStringSecurityDescriptorToSecurityDescriptor
进行转换,例如:
SECURITY_ATTRIBUTES sa = { sizeof(sa), 0, FALSE };
ULONG dwError;
if (ConvertStringSecurityDescriptorToSecurityDescriptorW(
L"D:NO_ACCESS_CONTROLS:(ML;;;;;LW)",
SDDL_REVISION_1, &sa.lpSecurityDescriptor, 0))
{
dwError = HttpCreateRequestQueue(HTTPAPI_VERSION_2,
requestQueueName,
&sa,
HTTP_CREATE_REQUEST_QUEUE_FLAG_CONTROLLER,
&m_requestQueue);
LocalFree(sa.lpSecurityDescriptor);
}
else
{
dwError = GetLastError();
}
在这里"D:NO_ACCESS_CONTROLS:(ML;;;;;LW)"
允许所有 -NO_ACCESS_CONTROLS
和LW
- LowLabel 的所有访问。(并非像第一个示例那样不受信任)
另一个变体(仅例如)使用说下一个字符串:
"D:(A;;GA;;;SY)(A;;GA;;;BA)(A;;GRGX;;;BU)(A;;GRGX;;;AC)S:(ML;;;;;LW)"
在这里,我们允许GENERIC_ALL
(GA
)到系统(SY
)和管理员(BA
)和用户(BU
)和所有应用程序包(AC
)GENERIC_READ|GENERIC_EXECUTE
- 将类型化数组写入子进程 stdin 无法正常工作
- 设置 ACL,指定允许在请求队列上接收 I/O 的工作进程
- 读取进程内存无法正常工作,使用 UTF16 字符串
- Dll进程挂钩不工作
- 如何使本机Unix/Linux守护进程在Android上工作
- CPP GDB 崩溃,没有核心和 GDB 附加到工作进程
- MPI 从进程在不再工作时挂起
- 杀死一个Linux进程,停止它在Oracle数据库中的查询工作吗?
- 停止QThread工作进程处理即将删除的资源的正确方法是什么
- 当用std::system启动进程时,我可以指定一个工作目录吗
- c++代码工作正常,但进程以termination结束,而不是返回0
- 如何获取绑定到我正在运行的控制台窗口的进程列表,这些进程也可以在 Windows 2000 中工作?
- 子进程中的Execl仅在特定情况下工作
- 如何在C/ c++中使三个进程工作
- 通知父进程恢复工作
- 进程外内存堆围绕32位地址空间工作
- Visual Studio.如何构建DLL(在命令行中),通过附加到进程来调试工作
- Execl与wget,子进程,为什么它不工作
- 捕获外部进程的工作目录[Qt/WinAPI]
- 如何在Windows上获得进程工作目录