一、方法:
1、创建一个边界
2、如何将对应于本地管理员(Local Administrators)的一个安全描述符(security identifier, SID)和它关联起来
3、如何创建或者打开其名称被用途互斥量内核对象前缀的一个专有命名空间。
{边界描述符将获得一个名称,但更重要的是,它会获得与它关联的一个特权用户组的SID,这样一来,Windows就可以确保只有在该用户隶属于这个特权组时,以其身份运行的应用程序才能在相同的边界中创建相同的使空间}
二、代码:
//边界句柄
HANDLE g_hBoundary = NULL; //这个不是内核对象,而是一个指针,所以不要用CloseHandle
//名字空间句柄
HANDLE g_hNamespace = NULL;
// 为边界和名字空间取名
PCTSTR g_szBoundary = TEXT("3-Boundary");
PCTSTR g_szNamespace = TEXT("3-Namespace");
//创建边界,并获得边界句柄
g_hBoundary = CreateBoundaryDescriptor(g_szBoundary, 0);
// 创建指向本地Administrators的用户描述符
//也可以用AllocateAndInitializeSID函数来获得SID值
BYTE localAdminSID[SECURITY_MAX_SID_SIZE];
PSID pLocalAdminSID = &localAdminSID;
DWORD cbSID = sizeof(localAdminSID);
if (!CreateWellKnownSid(
WinBuiltinAdministratorsSid, NULL, pLocalAdminSID, &cbSID)
) {
GetLastError());
return;
}
PSID pLocalAdminSID = &localAdminSID;
DWORD cbSID = sizeof(localAdminSID);
if (!CreateWellKnownSid(
WinBuiltinAdministratorsSid, NULL, pLocalAdminSID, &cbSID)
) {
GetLastError());
return;
}
//将一个特权用户组的SID与边界描述符关联起来
if (!AddSIDToBoundaryDescriptor(&g_hBoundary, pLocalAdminSID)) {
GetLastError());
return;
}
//指定SID中谁能进入边界并创建命名空间
if (!AddSIDToBoundaryDescriptor(&g_hBoundary, pLocalAdminSID)) {
GetLastError());
return;
}
//指定SID中谁能进入边界并创建命名空间
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.bInheritHandle = FALSE;
if (!ConvertStringSecurityDescriptorToSecurityDescriptor(
TEXT("D:(A;;GA;;;BA)"),
SDDL_REVISION_1, &sa.lpSecurityDescriptor, NULL)) {
GetLastError();
return;
}
//创建命名空间
g_hNamespace = CreatePrivateNamespace(&sa, g_hBoundary, g_szNamespace);
//释放内存
LocalFree(sa.lpSecurityDescriptor);
sa.nLength = sizeof(sa);
sa.bInheritHandle = FALSE;
if (!ConvertStringSecurityDescriptorToSecurityDescriptor(
TEXT("D:(A;;GA;;;BA)"),
SDDL_REVISION_1, &sa.lpSecurityDescriptor, NULL)) {
GetLastError();
return;
}
//创建命名空间
g_hNamespace = CreatePrivateNamespace(&sa, g_hBoundary, g_szNamespace);
//释放内存
LocalFree(sa.lpSecurityDescriptor);
//现在可以使用“3-Namespace\yourName”之类的名字空间了
//完成后请释放资源
ClosePrivateNamespace(g_hNamespace, 0);
DeleteBoundaryDescriptor(g_hBoundary);