C++ 判断某进程是普通进程还是管理员进程
时间: 2023-09-01 20:13:35 浏览: 162
判断进程是否以管理员权限运行.pdf
在 Windows 中,进程是否有管理员权限,取决于它的安全令牌中是否包含管理员组的 SID。因此,可以通过获取进程的安全令牌,判断它是否包含管理员组的 SID 来判断进程是否是管理员进程。
下面是一个简单的示例代码,可以判断指定进程是否是管理员进程:
```c++
#include <Windows.h>
#include <iostream>
bool IsAdmin(HANDLE token)
{
BOOL is_admin = FALSE;
PSID admin_group = NULL;
// 获取管理员组的 SID
SID_IDENTIFIER_AUTHORITY nt_authority = SECURITY_NT_AUTHORITY;
if (!AllocateAndInitializeSid(&nt_authority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &admin_group))
{
return false;
}
// 判断进程是否是管理员
if (!CheckTokenMembership(token, admin_group, &is_admin))
{
is_admin = false;
}
FreeSid(admin_group);
return is_admin == TRUE;
}
bool IsProcessAdmin(DWORD pid)
{
HANDLE process = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);
if (!process)
{
return false;
}
HANDLE token;
if (!OpenProcessToken(process, TOKEN_QUERY, &token))
{
CloseHandle(process);
return false;
}
bool is_admin = IsAdmin(token);
CloseHandle(token);
CloseHandle(process);
return is_admin;
}
int main(int argc, char* argv[])
{
if (argc != 2)
{
std::cout << "Usage: " << argv[0] << " <pid>" << std::endl;
return 1;
}
DWORD pid = std::stoul(argv[1]);
bool is_admin = IsProcessAdmin(pid);
std::cout << "Process " << pid << " is admin process: " << (is_admin ? "Yes" : "No") << std::endl;
return 0;
}
```
在上面的代码中,`IsAdmin` 函数用于判断进程是否是管理员进程,`IsProcessAdmin` 函数用于获取指定进程的安全令牌,并调用 `IsAdmin` 函数来判断进程是否是管理员进程。在 `main` 函数中,通过命令行参数传入要判断的进程的 PID,输出该进程是否是管理员进程。
阅读全文