从用户会话进程打开在服务中创建的JobObject



我有一个windows服务,它创建了一个JobObject,只要机器打开,我就需要保持它的活动状态——目标是管理一些用户会话进程,这些进程可以随时使用这个JobObject终止/启动。我在一个服务中创建它,以确保进程在启动时运行,并且它不会被普通用户杀死。

然而,我似乎无法从用户会话中打开这个JobObject的句柄,我总是收到一个拒绝访问(5)错误,尽管我甚至用NULL DACL创建了它。

我在这里发现了一个有点相关的问题:从我的应用程序中打开由我的服务创建的事件对象,但对我来说,即使使用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);

用户会话代码:

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

有什么想法吗?作为测试,我尝试从服务中生成一个用户会话进程,并通过服务代码分配JobObject,结果成功了,。。所以我很确定它与我丢失的安全设置有关,尽管DACL为空。

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

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);
}
}
}

相关内容

最新更新