我正在用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等是OpenProcessOpenThread的替代。 Toolhelp必须在内部调用这些函数以查询有关系统中进程和线程的信息。这些函数将检查对象上的ACL以查看您是否具有访问权限。通常,仅授予用户对其创建的进程的权限。如果调用代码的 token 中包含SeDebugPrivilege,则即使ACL未授予该代码访问权限,OpenProcess和OpenThread也将成功。

关于c++ - C++流程检查,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1435911/

10-09 09:03