gpt4 book ai didi

c++ - Windows 2012 上的 CreateMutex,错误代码为 ERROR_ACCESS_DENIED

转载 作者:可可西里 更新时间:2023-11-01 11:27:44 26 4
gpt4 key购买 nike

我正在尝试使用以下代码在 Windows 2012 上创建互斥量:

CreateMutex(securityAttributes, FALSE, TEXT("Global\\test"));

它总是给出错误代码 5 (ERROR_ACCESS_DENIED)。

我试图创建我发现的安全属性 here但没有成功。请注意,此代码适用于 Windows 7。

这里可能有什么问题?

我想创建可由 Windows 服务(系统帐户)和用户帐户使用的全局互斥锁。

最佳答案

问题似乎出在不适当的安全属性上。现在可以了。以下是创建安全属性的代码。

DWORD dwRes;
PSID pEveryoneSID = NULL, pAdminSID = NULL;
PACL pACL = NULL;
PSECURITY_DESCRIPTOR pSD = NULL;
EXPLICIT_ACCESS ea[2];
SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY;
PSECURITY_ATTRIBUTES pSA = NULL;
DWORD resultCode;

if( !AllocateAndInitializeSid( &SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &pEveryoneSID ) )
{
resultCode = -1;
goto ErrCleanUp;
}

ZeroMemory(&ea, 2 * sizeof(EXPLICIT_ACCESS));
ea[0].grfAccessPermissions = GENERIC_ALL;
ea[0].grfAccessMode = SET_ACCESS;
ea[0].grfInheritance = NO_INHERITANCE;
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
ea[0].Trustee.ptstrName = (LPTSTR) pEveryoneSID;

if(! AllocateAndInitializeSid( &SIDAuthNT,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&pAdminSID ) )
{
resultCode = -1;
goto ErrCleanUp;
}

ea[1].grfAccessPermissions = GENERIC_ALL;
ea[1].grfAccessMode = SET_ACCESS;
ea[1].grfInheritance = NO_INHERITANCE;
ea[1].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[1].Trustee.TrusteeType = TRUSTEE_IS_GROUP;
ea[1].Trustee.ptstrName = (LPTSTR) pAdminSID;

dwRes = SetEntriesInAcl(2, ea, NULL, &pACL);

if (ERROR_SUCCESS != dwRes)
{
resultCode = -1;
goto ErrCleanUp;
}

pSD = (PSECURITY_DESCRIPTOR) LocalAlloc( LPTR,
SECURITY_DESCRIPTOR_MIN_LENGTH );
if (NULL == pSD)
{
resultCode = -1;
goto ErrCleanUp;
}

if ( !InitializeSecurityDescriptor( pSD,
SECURITY_DESCRIPTOR_REVISION ) )
{
resultCode = -1;
goto ErrCleanUp;
}

if (! SetSecurityDescriptorDacl( pSD, TRUE, pACL, FALSE ) )
{
resultCode = -1;
goto ErrCleanUp;
}

pSA = (PSECURITY_ATTRIBUTES) LocalAlloc(LPTR, sizeof(SECURITY_ATTRIBUTES));
if (NULL == pSA)
{
resultCode = -1;
goto ErrCleanUp;
}

ZeroMemory(pSA, sizeof(SECURITY_ATTRIBUTES));
pSA->nLength = sizeof(SECURITY_ATTRIBUTES);
pSA->lpSecurityDescriptor = pSD;
pSA->bInheritHandle = FALSE;

*ppsa = pSA;

return 0;

ErrCleanUp:

if (pEveryoneSID)
FreeSid(pEveryoneSID);
if (pAdminSID)
FreeSid(pAdminSID);
if (pACL)
LocalFree(pACL);
if (pSD)
LocalFree(pSD);
if (pSA)
LocalFree(pSA);

*ppsa = NULL;
return 0;

关于c++ - Windows 2012 上的 CreateMutex,错误代码为 ERROR_ACCESS_DENIED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30709816/

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