使用 CreateToolhelp32Snapshot() 为 运行 进程拍摄快照时权限被拒绝
Permission denied while taking a snapshot of running process using CreateToolhelp32Snapshot()
今天我被要求将我的控制台应用程序(例如:App.exe)变成一项服务,只是用谷歌搜索并找到 nssm 然后使用它的有效命令将我的 APP.exe 变成一项服务,我的下一个工作是监视 运行 进程 (APP.exe),如果它的大小超过 >30MB,则重新启动它,那是 all.What 我之前从 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;
}
运行 上面说的监控app是一个系统进程。即,将其作为一项服务。
今天我被要求将我的控制台应用程序(例如:App.exe)变成一项服务,只是用谷歌搜索并找到 nssm 然后使用它的有效命令将我的 APP.exe 变成一项服务,我的下一个工作是监视 运行 进程 (APP.exe),如果它的大小超过 >30MB,则重新启动它,那是 all.What 我之前从 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;
}
运行 上面说的监控app是一个系统进程。即,将其作为一项服务。