我正在用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 :(得分:3)
要查询有关您无法直接访问的进程的信息,您需要拥有SeDebugPrivilege *。如果这是在Vista上,您很可能以标准用户身份运行,并且您没有该权限。您需要以管理员身份运行程序(请注意,TaskManager必须以管理员身份运行才能获取有关所有进程的信息。)
如果您以管理员身份运行,则问题很可能是默认情况下未启用SeDebugPrivilege。这是因为SeDebugPrivilege是一个非常危险的特权,可以随时使用。您可以通过调用AdjustTokenPrivileges API启用SeDebugPrivilege。此KB article显示了 - 您可以在网上找到其他参考文献。
*除其他外,SeDebugPrivilege是对OpenProcess和OpenThread的覆盖。 Toolhelp必须在内部调用这些函数来查询有关系统中进程和线程的信息。这些函数将检查对象上的ACL以查看您是否有权访问。用户通常只被授予他们创建的进程的权限。如果调用代码在其令牌中具有SeDebugPrivilege,则即使代码未被ACL授予访问权限,OpenProcess和OpenThread也会成功。