代码之家  ›  专栏  ›  技术社区  ›  Mikey

C++进程检查

  •  1
  • Mikey  · 技术社区  · 15 年前

    我正在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 回复  |  直到 15 年前
        1
  •  3
  •   Michael    15 年前

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

    如果您以管理员身份运行,则问题很可能是默认情况下未启用SeDebugPrivilege。这是因为SeDebugPrivilege是一个一直拥有的非常危险的特权。您可以通过调用 AdjustTokenPrivileges 应用程序编程接口。这个KB article

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