我正在用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
最佳答案
为了查询有关您没有直接访问权限的进程的信息,您需要拥有SeDebugPrivilege *。如果在Vista上运行,则很可能以标准用户身份运行,而您没有该特权。您需要以管理员身份运行程序(请注意,TaskManager必须以管理员身份运行才能获取所有进程的信息。)
如果您以管理员身份运行,则很可能是默认情况下未启用SeDebugPrivilege的问题。这是因为SeDebugPrivilege一直是非常危险的特权。您可以通过调用AdjustTokenPrivileges API来启用SeDebugPrivilege。此kb article显示了如何-您可能可以在网上找到其他引用。
* SeDebugPrivilege等是OpenProcess和OpenThread的替代。 Toolhelp必须在内部调用这些函数以查询有关系统中进程和线程的信息。这些函数将检查对象上的ACL以查看您是否具有访问权限。通常,仅授予用户对其创建的进程的权限。如果调用代码的 token 中包含SeDebugPrivilege,则即使ACL未授予该代码访问权限,OpenProcess和OpenThread也将成功。
关于c++ - C++流程检查,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1435911/