Windows C++ 判断进程是否是管理员权限运行的

判断进程管理员权限

BOOL IsRunningAsAdmin(DWORD pid) {
    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);
    if (!hProcess) {
        return FALSE;
    }
    HANDLE hToken;
    TOKEN_ELEVATION Elevation;
    DWORD cbSize = sizeof(TOKEN_ELEVATION);

    // 获取当前进程的访问令牌  
    if (!OpenProcessToken(hProcess, TOKEN_QUERY, &hToken))
        return false;

    // 获取令牌的提权信息  
    if (!GetTokenInformation(hToken, TokenElevation, &Elevation, cbSize, &cbSize)) {
        CloseHandle(hToken);
        return false;
    }

    // 检查是否提权  
    CloseHandle(hToken);
    return Elevation.TokenIsElevated != 0;
}

C++中获取管理员权限有多种方法,以下为你详细介绍: ### 方法一:使用`RunAsAdmin`函数 可通过`RunAsAdmin`函数尝试以管理员权限运行程序,代码如下: ```cpp #include <windows.h> #include <cstring> int RunAsAdmin(LPCSTR Path, LPCSTR Param, LPCSTR Dir, int Showcmd) { HINSTANCE res; res = ShellExecute(NULL, "runas", Path, Param, Dir, Showcmd); return (int)res; } bool IsProcessRunAsAdmin() { SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY; PSID AdministratorsGroup; BOOL b = AllocateAndInitializeSid( &NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &AdministratorsGroup); if(b) { CheckTokenMembership(NULL, AdministratorsGroup, &b); FreeSid(AdministratorsGroup); } return b == TRUE; } // 使用示例 int main() { int result = RunAsAdmin("your_program.exe", "", "", SW_SHOWNORMAL); return 0; } ``` 使用时调用`RunAsAdmin`函数,一个参数是程序运行时的参数,另一个是启动窗口的状态。此函数会先判断程序是否管理员权限,若没有就尝试获取,获取成功会返回1(表示又启动了一个有管理员权限的程序,并非当前程序获得了管理员权限),获取失败返回0,本来已有管理员权限则返回2 [^2]。 ### 方法二:使用`GetPrivilege`函数(避免双窗口) 执行某些代码(如修改系统敏感文件)需要管理员权限,很多申请管理员权限的函数执行后会出现两个窗口,其中一个进程没有管理员权限,可使用`exit()`函数关掉没有管理员权限进程,代码如下: ```cpp #include <windows.h> bool GetPrivilege()// 提权 { CreateEvent(NULL, FALSE, FALSE, _T("{29544E05-024F-4BC1-A272-452DBC8E17A4}")); //用来创建或打开一个命名的或无名的事件对象 if (ERROR_SUCCESS != GetLastError()) { return false; } else { TCHAR strPath[MAX_PATH] = { 0 }; HMODULE hModule = NULL; GetModuleFileName(hModule, strPath, MAX_PATH); SHELLEXECUTEINFO sei = { sizeof(SHELLEXECUTEINFO) }; sei.lpVerb = TEXT("runas"); sei.lpFile = strPath; sei.nShow = SW_SHOWNORMAL; if (!ShellExecuteEx(&sei)) //对指定应用程序运行某个操作 { DWORD dwStatus = GetLastError(); if (dwStatus == ERROR_CANCELLED) { return false; } else if (dwStatus == ERROR_FILE_NOT_FOUND) { return false; } } } Sleep(100); // 防止退出的太早 exit(0); //退出没有管理员权限进程 return true; } // 使用示例 int main() { if (GetPrivilege()) { // 执行需要管理员权限的操作 } return 0; } ``` 该函数通过创建事件对象判断是否已有程序以管理员权限运行,若没有则尝试以管理员权限重新启动程序,并关闭当前无权限进程 [^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值