判断进程是否有管理员权限

主要用在有UAC弹窗的情况下,没有管理员运行程序时,IsElevatedAdministrator会返回FALSE

#include<Windows.h>
#include<stdio.h>
BOOL IsElevatedAdministrator()
{
	BOOL fIsAdmin = FALSE;
	HANDLE hTokenToCheck = NULL;
	DWORD  lastErr;
	DWORD sidLen = SECURITY_MAX_SID_SIZE;
	BYTE localAdminsGroupSid[SECURITY_MAX_SID_SIZE];

	if (!CreateWellKnownSid(WinBuiltinAdministratorsSid, NULL,
		localAdminsGroupSid, &sidLen))
	{
		goto CLEANUP;
	}    
	if (CheckTokenMembership(hTokenToCheck, localAdminsGroupSid, &fIsAdmin))
	{
		lastErr = ERROR_SUCCESS;
	}

CLEANUP:             
	if (hTokenToCheck)
	{
		CloseHandle(hTokenToCheck);
		hTokenToCheck = NULL;
	}

	return (fIsAdmin);
}

int main()
{
	if (IsElevatedAdministrator(NULL))
	{
		printf("有管理员权限\n");
	}
	else
	{
		printf("没有管理员权限\n");
	}
	getchar();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 Windows API 的 `CheckTokenMembership` 函数来判断某个进程是否需要管理员权限。具体步骤如下: 1. 获取当前进程的令牌句柄,可以使用 `OpenProcessToken` 函数。 2. 判断当前进程是否管理员,可以使用 `CheckTokenMembership` 函数,将管理员组的 SID 作为参数传入,判断当前进程是否管理员。 3. 获取要判断进程的句柄,可以使用 `OpenProcess` 函数。 4. 获取要判断进程的令牌句柄,可以使用 `OpenProcessToken` 函数。 5. 判断判断进程是否需要管理员权限,可以使用 `CheckTokenMembership` 函数,将管理员组的 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 << " requires admin privilege: " << (is_admin ? "Yes" : "No") << std::endl; return 0; } ``` 其中,`IsAdmin` 函数用于判断当前进程是否管理员,`IsProcessAdmin` 函数用于判断判断进程是否需要管理员权限。在 `main` 函数中,通过命令行参数传入要判断进程的 PID,输出该进程是否需要管理员权限

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值