我在库中创建一个由普通应用程序和服务使用的全局信号量。 如果我在服务之前运行我的正常应用程序,一切都很顺利,但是如果我改变顺序(我的意思是,在应用程序之前运行服务),当我尝试创建或打开现有的信号量时,我将在正常应用程序中获得访问被拒绝错误。 我在信号量创建期间设置了SEMAPHORE_ALL_ACCESS,但它并没有解决问题。以一种荒谬的方式,我还添加了SYNCHRONIZE和SEMAPHORE_MODIFY_STATE(通过|操作数),但它没有'也解决了这个问题。
你知道吗? 我使用的是Windows 8.1(x64)并运行32位版本的服务和应用程序。答案 0 :(得分:0)
您需要降低资源的完整性级别,尝试使用此类内容进行创建。
SECURITY_DESCRIPTOR sd;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = &sd;
if(InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION))
{
if(SetSecurityDescriptorDacl(&sd, TRUE, (PACL) NULL, FALSE))
{
PSECURITY_DESCRIPTOR pSD = NULL;
// Try to lower Integrity, if OS is Vista or higher
if(bIsOSVistaOrLater)
{
if(ConvertStringSecurityDescriptorToSecurityDescriptor("S:(ML;;NW;;;LW)", SDDL_REVISION_1, &pSD, NULL))
{
PACL pSacl = NULL;
BOOL fSaclPresent = FALSE;
BOOL fSaclDefaulted = FALSE;
if(GetSecurityDescriptorSacl(pSD, &fSaclPresent, &pSacl, &fSaclDefaulted) )
{
if(SetSecurityDescriptorSacl(sa.lpSecurityDescriptor, TRUE, pSacl, FALSE))
{
... = CreateSemaphore(&sa, 1, 1, "xpto");
}
}
}
}
else
{
... = CreateSemaphore(&sa, 1, 1, "xpto");
}
}
}
您可以阅读更多相关信息:here