使用CreateToolhelp32Snapshot()获取正在运行的进程的快照时权限被拒绝

时间:2015-08-25 15:08:37

标签: c++ windows winapi system

今天我被要求将我的控制台应用程序(例如:App.exe)转换为服务,只需用Google搜索并找到nssm然后使用其有效命令将我的APP.exe转换为服务,我的下一个工作是监控运行进程(APP.exe),如果它的大小超过> 30MB重新启动那就是全部。我之前从nssm学到的是当我杀死APP.exe nssm时自动重启它,所以现在我只需要代码只在超过30MB时监控和杀死APP.exe,最后我创建了一个监控的应用程序出现问题,在我使用CreateToolhelp32Snapshot()的监控应用程序中所有正在运行的进程的快照,并尝试按名称查找我的APP.exe然后按pmc.WorkingSetSize获取它的大小,但是当我运行我的监控应用程序时,它无法找到APP.EXE虽然我看到它存在于任务管理器中,但我甚至以管理员的身份运行它,但任何人都可以帮助摆脱这个问题。

拍摄快照时我得到的错误是权限被拒绝。

请参阅下面的代码:

int main()
{
LOG mon;
PROCESSENTRY32 pe32 = {0};
HANDLE    hSnap;
HANDLE   hprocess;
PROCESS_MEMORY_COUNTERS pmc;
int       iDone;
int       iTime = 60;
bool      bProcessFound;

while(true)    // go forever
{
    cout<<"adjfhaljkehdfhwoefjiej";
    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    pe32.dwSize = sizeof(PROCESSENTRY32);
    Process32First(hSnap,&pe32);     // Can throw away, never an actual app

    bProcessFound = false;   //init values
    iDone = 1;

    while(iDone)    // go until out of Processes
    {
        iDone = Process32Next(hSnap,&pe32);
        if (strcmp(pe32.szExeFile,"APP.exe") == 0)    // Did we find our process?
        {
            DWORD processID = pe32.th32ProcessID;
            hprocess= OpenProcess(  PROCESS_QUERY_INFORMATION |
                                    PROCESS_VM_READ,
                                    FALSE, processID );
            if (GetProcessMemoryInfo( hprocess, &pmc, sizeof(pmc)))
                {
                    size_t procsize=pmc.WorkingSetSize;
                    cout<<procsize;
                    if(procsize>30MB)--mylogic
                    {
            hprocess=OpenProcess(PROCESS_TERMINATE,0, processID);
            TerminateProcess (hprocess, 0);
            mon.RestartLog("Server Closed due to large size");

                    }
                }


            bProcessFound = true;
            iDone = 0;
        }
    }

    if(!bProcessFound)   .
    {

         mon.RestartLog("Server Down ");

    }
    Sleep(iTime*50);    // delay x amount of seconds.
}
return 0;

}

1 个答案:

答案 0 :(得分:0)

将上述监控应用程序作为系统进程运行。即,将其作为一种服务。