c++ - 接收用户所属的所有成员组的 SID?
问题描述
我正在使用下面的代码来检索流程所有者的 SID,这里一切都很好,但是我如何才能检索流程所有者所属的至少任何(最多每个)成员资格 SID?
PSID g_pSID;
BOOL GetCurrentProcessSID()
{
DWORD dwSize = 0, dwError, dwResult = 0;
HANDLE hToken;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
{
printf("OpenProcessToken Error %u\n", GetLastError());
return FALSE;
}
// Call GetTokenInformation to get the buffer size.
TOKEN_USER tU;
if (!GetTokenInformation(hToken, TokenUser, &tU, 0, &dwSize))
{
dwError = GetLastError();
if (dwError != ERROR_INSUFFICIENT_BUFFER)
{
std::cout << "GetTokenInformation failed, error " << dwError;
CloseHandle(hToken);
return 0;
}
}
PTOKEN_OWNER to = (PTOKEN_OWNER)LocalAlloc(LPTR, dwSize);
if (!to)
{
dwError = GetLastError();
std::cout << "LocalAlloc failed, error " << dwError;
CloseHandle(hToken);
return 0;
}
if (!GetTokenInformation(hToken, TokenOwner, to, dwSize, &dwSize))
{
dwError = GetLastError();
std::cout << "GetTokenInformation failed, error " << dwError;
LocalFree(to);
CloseHandle(hToken);
return 0;
}
g_pSID = to->Owner;
return TRUE;
}
另外,除了使用全局变量之外,我在片段中是否有任何错误,有什么建议吗?
解决方案
您首先用于TokenUser
获取 的缓冲区大小TokenInformation
,然后TokenOwner
在第二个调用者中使用。不确定你真正想要的是哪个。有一个很好的解释。
TokenOwner
是令牌的一部分,它确定由在令牌的安全上下文中运行的进程或线程创建的对象的默认所有者。TokenUser
是令牌所代表的用户。
此外,您应该LocalFree(to)
在函数返回之前调用。
如果要获取与令牌关联的组帐户。TokenGroups
你可以在调用时得到它GetTokenInformation
。
#define MAX_NAME 256
BOOL RetriveGroupSid(VOID)
{
DWORD i, dwSize = 0, dwResult = 0;
HANDLE hToken;
PTOKEN_GROUPS pGroupInfo;
SID_NAME_USE SidType;
char lpName[MAX_NAME];
char lpDomain[MAX_NAME];
SID_IDENTIFIER_AUTHORITY SIDAuth = SECURITY_NT_AUTHORITY;
// Open a handle to the access token for the calling process.
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
{
printf("OpenProcessToken Error %u\n", GetLastError());
return FALSE;
}
// Call GetTokenInformation to get the buffer size.
if (!GetTokenInformation(hToken, TokenGroups, NULL, dwSize, &dwSize))
{
dwResult = GetLastError();
if (dwResult != ERROR_INSUFFICIENT_BUFFER) {
printf("GetTokenInformation Error %u\n", dwResult);
return FALSE;
}
}
// Allocate the buffer.
pGroupInfo = (PTOKEN_GROUPS)GlobalAlloc(GPTR, dwSize);
// Call GetTokenInformation again to get the group information.
if (!GetTokenInformation(hToken, TokenGroups, pGroupInfo,
dwSize, &dwSize))
{
printf("GetTokenInformation Error %u\n", GetLastError());
return FALSE;
}
for (i = 0; i < pGroupInfo->GroupCount; i++)
{
dwSize = MAX_NAME;
LPSTR sid;
if (!ConvertSidToStringSid(pGroupInfo->Groups[i].Sid, &sid))
{
printf("ConvertSidToStringSid Error %u\n", GetLastError());
return FALSE;
}
if (!LookupAccountSid(NULL, pGroupInfo->Groups[i].Sid,
lpName, &dwSize, lpDomain,
&dwSize, &SidType))
{
dwResult = GetLastError();
if (dwResult == ERROR_NONE_MAPPED)
strcpy_s(lpName, dwSize, "NONE_MAPPED");
else
{
printf("LookupAccountSid Error %u\n", GetLastError());
LocalFree(sid);
return FALSE;
}
}
printf("%s : %s\\%s \n", sid, lpDomain, lpName);
// Find out whether the SID is enabled in the token.
if (pGroupInfo->Groups[i].Attributes & SE_GROUP_ENABLED)
printf("The group SID is enabled.\n");
else if (pGroupInfo->Groups[i].Attributes &
SE_GROUP_USE_FOR_DENY_ONLY)
printf("The group SID is a deny-only SID.\n");
else
printf("The group SID is not enabled.\n");
LocalFree(sid);
}
if (pGroupInfo)
GlobalFree(pGroupInfo);
return TRUE;
}
对于另一种方式,另请参阅在 C++ 中检索用户所属的所有组...
推荐阅读
- r - 如何在 R 中按组计算 SD,而不会丢失在 ggplot2 中绘图仍需要的列?
- sql - 使用恢复的数据库中的值和匹配的 ID 更新当前数据库
- twig - Timber Twig - 如果日期/时间在现在/未来,则显示元素
- ubuntu - 函数 slqastrt、sqlacall、sqlastop 上的 Ubuntu DB2 gcc prep 错误
- sql - 在动态 ssql 中声明一个变量
- python-3.x - 模块 matrixprofile.motifs 中的主题函数不返回 max_motifs(ts, mp, max_motifs=10) 中给出的确切计数
- amazon-web-services - 在 AWS 中,为什么 NLB 可以提供静态 IP 地址而 ALB 不能?
- module - 为什么多处理 Julia 会破坏我的模块导入?
- python - 我无法加载张量板
- javascript - Fullcalendar 4:从模式引导更新信息事件