C ++进程检查

时间:2009-09-16 22:49:08

标签: c++ windows winapi process

我正在用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

1 个答案:

答案 0 :(得分:3)

要查询有关您无法直接访问的进程的信息,您需要拥有SeDebugPrivilege *。如果这是在Vista上,您很可能以标准用户身份运行,并且您没有该权限。您需要以管理员身份运行程序(请注意,TaskManager必须以管理员身份运行才能获取有关所有进程的信息。)

如果您以管理员身份运行,则问题很可能是默认情况下未启用SeDebugPrivilege。这是因为SeDebugPrivilege是一个非常危险的特权,可以随时使用。您可以通过调用AdjustTokenPrivileges API启用SeDebugPrivilege。此KB article显示了 - 您可以在网上找到其他参考文献。

*除其他外,SeDebugPrivilege是对OpenProcessOpenThread的覆盖。 Toolhelp必须在内部调用这些函数来查询有关系统中进程和线程的信息。这些函数将检查对象上的ACL以查看您是否有权访问。用户通常只被授予他们创建的进程的权限。如果调用代码在其令牌中具有SeDebugPrivilege,则即使代码未被ACL授予访问权限,OpenProcess和OpenThread也会成功。