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;
}

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ 中,可以使用 Windows API 函数 OpenProcess 来打开一个进程,然后使用 GetTokenInformation 函数获取进程的访问令牌(access token)。可以通过检查访问令牌中是否包含管理员组的 SID(Security Identifier)来判断进程是否需要管理员权限。 具体步骤如下: 1. 使用 OpenProcess 函数打开进程,获取进程句柄。 2. 使用 OpenProcessToken 函数获取进程的访问令牌。 3. 使用 GetTokenInformation 函数获取访问令牌中的 SID,使用 CheckTokenMembership 函数判断是否包含管理员组的 SID。 4. 如果返回值为 TRUE,则说明进程需要管理员权限;如果返回值为 FALSE,则说明进程不需要管理员权限。 示例代码如下: ``` #include <Windows.h> #include <Sddl.h> #include <iostream> using namespace std; bool CheckProcessAdmin(HANDLE hProcess) { HANDLE hToken; DWORD dwTokenSize; PTOKEN_GROUPS pTokenGroups; SID_IDENTIFIER_AUTHORITY sidAuth = SECURITY_NT_AUTHORITY; PSID pSidAdmin; BOOL bIsAdmin = FALSE; // 打开进程的访问令牌 if (!OpenProcessToken(hProcess, TOKEN_QUERY, &hToken)) { cout << "OpenProcessToken failed, error code: " << GetLastError() << endl; return false; } // 获取访问令牌中的 SID if (!GetTokenInformation(hToken, TokenGroups, NULL, 0, &dwTokenSize)) { if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { cout << "GetTokenInformation failed, error code: " << GetLastError() << endl; CloseHandle(hToken); return false; } } pTokenGroups = (PTOKEN_GROUPS)malloc(dwTokenSize); if (!GetTokenInformation(hToken, TokenGroups, pTokenGroups, dwTokenSize, &dwTokenSize)) { cout << "GetTokenInformation failed, error code: " << GetLastError() << endl; CloseHandle(hToken); free(pTokenGroups); return false; } // 获取管理员组的 SID if (!AllocateAndInitializeSid(&sidAuth, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &pSidAdmin)) { cout << "AllocateAndInitializeSid failed, error code: " << GetLastError() << endl; CloseHandle(hToken); free(pTokenGroups); return false; } // 判断是否包含管理员组的 SID for (DWORD i = 0; i < pTokenGroups->GroupCount; i++) { if (EqualSid(pSidAdmin, pTokenGroups->Groups[i].Sid)) { bIsAdmin = TRUE; break; } } FreeSid(pSidAdmin); CloseHandle(hToken); free(pTokenGroups); return bIsAdmin; } int main() { // 打开进程 HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, 1234); if (hProcess == NULL) { cout << "OpenProcess failed, error code: " << GetLastError() << endl; return 1; } // 判断进程是否需要管理员权限 if (CheckProcessAdmin(hProcess)) { cout << "The process requires administrator privilege." << endl; } else { cout << "The process does not require administrator privilege." << endl; } CloseHandle(hProcess); return 0; } ``` 其中,1234 表示进程的 PID,可以根据实际情况修改。注意,打开进程需要使用 PROCESS_QUERY_LIMITED_INFORMATION 权限,否则会返回 ACCESS_DENIED 错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值