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

Permission denied while taking a snapshot of running process using CreateToolhelp32Snapshot()

本文关键字:快照 拒绝 权限 进程 CreateToolhelp32Snapshot 运行 使用      更新时间:2023-10-16

今天我被要求把我的控制台应用程序(例如:app .exe)变成一个服务,只是谷歌和发现nssm然后使用其有效的命令把我的app .exe变成一个服务,我的下一个工作是监控运行过程(app .exe),如果它的大小超过>30MB重启它,这就是全部。我以前从nssm中学到的是,当我杀死app .exe nssm自动重新启动它时,所以现在我只需要为监控和杀死app .exe编写代码,当它超过30MB时,最后我创建了一个应用程序来监控问题出现了,在监控应用程序中,我一直使用CreateToolhelp32Snapshot()拍摄所有运行进程的快照,并尝试通过其名称找到我的app .exe,然后通过pmc.WorkingSetSize获得它的大小,然而,当我运行监控应用程序时,它找不到app . exe,尽管我看到它存在于任务管理器中,我甚至以管理员身份运行它,但它仍然是一样的,任何人都可以帮助我摆脱这个问题。

我在拍摄快照时得到的错误是permission denied.

请参阅下面我的代码:

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;
}

将上述监视器应用程序作为系统进程运行。也就是说,让它成为一个服务。