在 VS2008 開發中,調試(Debug)模式下程式能正常獲取進程信息、操作其他進程,但切換到發布(Release)模式後功能失效。根本原因是 VS2008 預設不啟用管理員權限清單,Release 構建未自動提權,導致 OpenProcess 等需要 PROCESS_QUERY_INFORMATION、PROCESS_VM_READ 等高權限的 API 呼叫失敗。
在程式啟動早期調用以下代碼,啟用當前進程的 SE_DEBUG_NAME 特權,即可獲得對系統進程的完全訪問權限。
#include <windows.h>
BOOL EnableDebugPrivilege() {
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
// 1. 打開當前進程令牌
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
return FALSE;
}
// 2. 查找 SE_DEBUG_NAME 特權的 LUID
if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid)) {
CloseHandle(hToken);
return FALSE;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// 3. 調整令牌特權
if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, NULL)) {
CloseHandle(hToken);
return FALSE;
}
CloseHandle(hToken);
return GetLastError() == ERROR_SUCCESS;
}
int main() {
if (!EnableDebugPrivilege()) {
printf("提權失敗,請以管理員身份運行程式\n");
return 1;
}
// 此後可正常 OpenProcess、ReadProcessMemory 等
return 0;
}
在專案屬性 → 配置屬性 → 鏈接器 → 清單檔 → UAC 執行層級,選擇 requireAdministrator。或手動編寫 app.manifest:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
編譯時嵌入清單,程式啟動時系統會彈出 UAC 提示,用戶確認後以管理員權限運行,徹底解決 Debug/Release 權限差異。