- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试使用以下代码在 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/
我正在尝试执行以下操作: 进程 A 应该使用 OpenMutex 来查看进程 B 是否正在运行。 进程 B 应该使用 CreateMutex 让进程 A 知道它正在运行。其实很简单... 这是怎么回事
假设我调用 CreateMutex。 HANDLE h; h=CreateMutex(NULL, TRUE, NULL); waitforsingleobject(h, INFINITE); ////
我正在使用 CreateMutex停止多个应用程序同时运行某些功能。这些函数在 dll 中,因此可以被同一个应用程序或单独的应用程序调用。这个 dll 与硬件对话,所以如果另一个函数已经在运行,我想返
以下代码有时可以正常工作,有时会抛出“访问被拒绝”错误。行为不一致。 _hMutex = CreateMutex(NULL, FALSE, MutexName); if (_hMutex ==
我认为这两个函数将返回相同的内核句柄。并且我写了一个测试程序来证明我的观点: 在我的程序中,我创建了一个名为“_MYTEST”的内核句柄 hHandle1 = CreateMutex(NULL, fa
我正在将我的应用程序从 Linux 移植到 Windows。我对跨平台移植应用程序的艺术相当陌生。据我所知,Windows 本身并不支持 POSIX 线程实现。这是真的?我听说过 windows 的一
我想使用 CreateMutex作为将我的应用程序限制为单一实例的一种手段。 (具体来说,每个用户一个实例。) The MSDN documentation to CreateMutex 警告恶意用户
我这里真的是一头雾水。我通读了 MSDN 文章,但仍然无法弄清楚发生了什么。我的问题是:当使用以下代码运行一些进程时,一切正常: HANDLE m = CreateMutex(NULL, FALSE,
我想从 CreatMutex 切换到 boost::interprocess::named_mutex 以将我的应用程序限制为单个实例。当应用程序正常运行和结束时,这两种方法都有效。但是,当应用程序崩
我正在编写一个具有共享内存的应用程序,并正在创建名称上带有适当 "Local\" 前缀的命名互斥体。但是,每次我调用 CreateMutex 函数来创建句柄时,我都会得到一个 NULL 返回值。我什至
MSDN CreatMutex() 文档 ( http://msdn.microsoft.com/en-us/library/ms682411%28VS.85%29.aspx ) 在结尾处包含以下评论
我刚刚花了几天时间来追踪一个错误,该错误是由于调用::CreateMutex() 失败而引发未处理的异常。请记住,CreateMutex() 不会尝试锁定互斥量,只是为了打开一个句柄。 即使互斥量已经
我正在尝试使用以下代码在 Windows 2012 上创建互斥量: CreateMutex(securityAttributes, FALSE, TEXT("Global\\test")); 它总是给
我有两个进程,一个写入内存映射文件 - 生产者 - 而另一个从内存文件读取 - 消费者。 第一个进程使用 CreateMutex() 函数创建互斥锁,并将 initialOwner 参数设置为 TRU
我是一名优秀的程序员,十分优秀!