2009-09-16 78 views
1

我創建C++中的任務管理器類型的應用程序,目前我使用:C++程序檢查

`

void MyFrame::ProcChecker(bool showmessage=false){ 
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 
PROCESSENTRY32 *processInfo = new PROCESSENTRY32; 
processInfo->dwSize = sizeof(PROCESSENTRY32); 

int index = 0; 
string procList = ""; 

while(Process32Next(hSnapShot,processInfo) != false){ 
    HANDLE modSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, processInfo->th32ProcessID); 

    MODULEENTRY32 *moduleInfo = new MODULEENTRY32; 
    moduleInfo->dwSize = sizeof(MODULEENTRY32); 

    index++; 
    stringstream indexstr; 
    indexstr << index; 

    Module32First(modSnapShot,moduleInfo); 

    procList = procList + indexstr.str() + ": " + wxString((string)processInfo->szExeFile) + "[" + wxString((string)moduleInfo->szExePath) + "]" + "\r\n"; 
} 

if(showmessage){ 
    MessageBox(NULL,procList.c_str(),"Processes",false); 
} 
} 

`

我來了對面的問題是很多進程限制訪問,我認爲我需要以某種方式獲得應用程序當前擁有的更高權限。我認爲這與我需要創建內核模式驅動程序有關。如果有人能指引我正確的方向,將不勝感激! :)

我剛開始在C++中,所以我瞭解自己現有的代碼可能是可怕的:P

+0

經過一番研究,我發現這個線程是非常有幫助的:http://www.codeguru.com/forum/showthread.php?t=299895 – Mikey

回答

3

爲了查詢進程的信息,你不直接訪問,你需要有SeDebugPrivilege *。如果這是在Vista上,您很可能以標準用戶身份運行,並且您沒有該權限。您需要以管理員身份運行程序(請注意,TaskManager必須以管理員身份運行以獲取有關所有進程的信息。)

如果以管理員身份運行,則問題很可能是SeDebugPrivilege默認情況下未啓用。這是因爲SeDebugPrivilege是一個非常危險的特權。您可以通過調用AdjustTokenPrivileges API來啓用SeDebugPrivilege。此KB article顯示瞭如何 - 您可能在網上找到其他參考。

* SeDebugPrivilege,除其他外,是對OpenProcessOpenThread的替代。 Toolhelp必須在內部調用這些函數來查詢系統中進程和線程的信息。這些功能將檢查對象上的ACL以查看您是否有權訪問。用戶通常只被授予他們創建的進程的權限。如果調用代碼的令牌中包含SeDebugPrivilege,則即使代碼未被ACL授予訪問權限,OpenProcess和OpenThread也會成功。

+0

謝謝非常多:)我會做一些研究 – Mikey