如何检查未"self"进程的组成员身份?
How to check group membership for a process that is not "self"?
我正在尝试使用此代码来检查我有句柄的任意进程的安全组成员身份。但是在下面的代码中CheckTokenMembership
失败,错误代码为 1309 或 ERROR_NO_IMPERSONATION_TOKEN
.我不确定我是否理解如何获得该模拟令牌...
那么我在这里做错了什么?
void check_membership(HANDLE hProc)
{
HANDLE hToken;
if(OpenProcessToken(hProc, TOKEN_QUERY, &hToken))
{
check_group_membership(hToken, L"Local Group", DOMAIN_ALIAS_RID_USERS);
check_group_membership(hToken, L"Admin Group", DOMAIN_ALIAS_RID_ADMINS);
check_group_membership(hToken, L"Domain Admin Group", DOMAIN_GROUP_RID_ADMINS);
check_group_membership(hToken, L"Schema Admin Group", DOMAIN_GROUP_RID_SCHEMA_ADMINS);
check_group_membership(hToken, L"Enterprise Admin Group", DOMAIN_GROUP_RID_ENTERPRISE_ADMINS);
CloseHandle(hToken);
}
}
void check_group_membership(HANDLE hToken, LPCTSTR pStrName, DWORD nSubauthority)
{
BOOL bIsMember;
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
wprintf(L"Local %s: ", pStrName);
PSID pSID = NULL;
if(AllocateAndInitializeSid(&NtAuthority, 2,
SECURITY_BUILTIN_DOMAIN_RID,
nSubauthority,
0, 0, 0, 0, 0, 0, &pSID))
{
bIsMember = FALSE;
if(CheckTokenMembership(hToken, pSID, &bIsMember))
{
wprintf(L"%s", bIsMember ? L"Yes" : L"No");
}
else
{
wprintf(L"<CheckErr: (%d)>", GetLastError());
}
}
else
{
wprintf(L"<SidErr: (%d)>", GetLastError());
}
wprintf(L"n");
if(pSID)
{
FreeSid(pSID) == NULL);
pSID = NULL;
}
}
MSDN 确实确认这是一项要求:
令牌必须是模拟令牌。
它还说对于 NULL 句柄情况:
CheckTokenMembership
使用调用线程的模拟令牌。如果线程未模拟,则该函数将复制线程的主令牌以创建模拟令牌。
你可以试试这个:
HANDLE hImpToken;
if (DuplicateTokenEx(hToken, TOKEN_QUERY, NULL, SecurityImpersonation, TokenImpersonation, &hImpToken))
{
CheckTokenMembership(hImpToken, ...);
CloseHandle(hImpToken);
}
相关文章:
- boost::进程间消息队列引发错误
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 是否可以通过C++扩展强制多个python进程共享同一内存
- IPC使用多个管道和分支进程来运行Python程序
- 异常属于C++中的线程还是进程
- WMI检测进程创建事件-c++
- c++多进程编写一个唯一的文件
- 如何在C++中将函数发送到另一个进程
- 在Qt Creator中,如何在连接到正在运行的进程后查看控制台输出
- 终止 QProcess 不会终止子进程
- 将返回值从 exe 传递到 bat,并将其传递给 C# 中的进程
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- Windows 进程间同步类似事件?
- 在挂钩启动新线程时解除挂钩进程
- pclose() 不会给我进程退出代码
- 运行代码时,c++ 会终止进程
- 可以读入进程内存的最大块大小是多少?
- 枚举进程模块在有效句柄上返回无效句柄
- 如何读取特定地址的进程内存?
- 如何检查未"self"进程的组成员身份?