gpt4 book ai didi

windows - 从用户 session 进程打开在服务中创建的 JobObject

转载 作者:可可西里 更新时间:2023-11-01 10:33:13 29 4
gpt4 key购买 nike

我有一个创建 JobObject 的 Windows 服务,只要机器打开我就需要它保持事件状态 - 目标是管理一些可以随时终止/启动此 JobObject 的用户 session 进程。我在服务中创建它以确保进程在启动时运行,并且它不会被普通用户终止。

但是,我似乎无法从用户 session 中打开此 JobObject 的句柄,尽管使用 NULL DACL 创建它,但我总是收到访问被拒绝 (5) 错误。

我在这里发现了一个有点相关的问题:Open an Event object created by my service from my application ,但对我来说,即使使用 NULL DACL,当请求 JOB_OBJECT_ASSIGN_PROCESS 权限时,我的访问被拒绝(例如,请求 SYNCHRONIZE 有效)。

服务代码:

PSECURITY_DESCRIPTOR psd = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
InitializeSecurityDescriptor(psd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(psd, TRUE, NULL, FALSE);

SECURITY_ATTRIBUTES secAttr= {0};
secAttr.nLength = sizeof(secAttr);
secAttr.bInheritHandle = false;
secAttr.lpSecurityDescriptor = psd;

hJobObject = CreateJobObject(&secAttr, SCL_JOBOBJECTNAME);
LocalFree(psd);

用户 session 代码:

hJobObject = OpenJobObject(JOB_OBJECT_ASSIGN_PROCESS, FALSE, SCL_JOBOBJECTNAME);
if (hJobObject == NULL)
{
DWORD wError = GetLastError();
printf("Error: %d\n", wError); // this always pops 5
return 1;
}

有什么想法吗?作为测试,我尝试从服务中生成一个用户 session 进程,并通过服务代码分配 JobObject,并且成功了,..所以我相当确定它与我缺少的安全设置相关,尽管有 NULL DACL .

最佳答案

如果您在服务中创建作业 - 默认情况下此对象将具有 WinSystemLabelSid 标签 SID:S-1-16-16384 - 系统强制级别。 (我只是检查一下)所以您不仅需要设置 Dacl,还需要设置 Sacl。例如:

    ULONG cb = MAX_SID_SIZE;
PSID LowLabelSid = (PSID)alloca(MAX_SID_SIZE);
if (CreateWellKnownSid(WinLowLabelSid, 0, LowLabelSid, &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, LowLabelSid))
{
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 (HANDLE hJob = CreateJobObject(&sa, L"Global\\{58BFC6DB-BE93-4cdb-919C-4C713ACB5A32}"))
{
CloseHandle(hJob);
}
}
}

关于windows - 从用户 session 进程打开在服务中创建的 JobObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41985061/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com