16,548
社区成员




#define _WIN32_WINNT 0x0500
#include<Windows.h>
#include<WinSafer.h>
#include<iostream>
#include<string>
#include<fstream>
#include <iostream>
using namespace std;
int main()
{
SECURITY_ATTRIBUTES sa;//安全结构体,在CreateFile中使用
sa.nLength = sizeof( SECURITY_ATTRIBUTES );
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
PROCESS_INFORMATION piProcInfo;
STARTUPINFO siStartInfo;//启动信息结构体,设置它的hStdOutput和hStdInput可以重定用户进程的数据输入与输出
ZeroMemory(&piProcInfo, sizeof(PROCESS_INFORMATION));
ZeroMemory(&siStartInfo, sizeof(STARTUPINFO));
siStartInfo.cb = sizeof(STARTUPINFO);
siStartInfo.dwFlags |= STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
siStartInfo.wShowWindow = SW_HIDE;//让用户进程的窗口隐藏启动
char cmd[200] = "notepad";
CreateProcess(NULL,cmd,NULL,NULL,TRUE,CREATE_SUSPENDED ,NULL,NULL,&siStartInfo,&piProcInfo);
HANDLE hJob = CreateJobObject(NULL, NULL);//创建作业对象,利用它来限制用户进程运行
JOBOBJECT_EXTENDED_LIMIT_INFORMATION lim;//作业扩展限制
lim.BasicLimitInformation.ActiveProcessLimit = 1;//限制用户进程不能创建新进程
lim.BasicLimitInformation.PerProcessUserTimeLimit.QuadPart =(LONGLONG)(1000 *10000); //设置运行时间
lim.JobMemoryLimit = (size_t)(65536 *1024); //设置运行内存
lim.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_ACTIVE_PROCESS
| JOB_OBJECT_LIMIT_PROCESS_TIME
| JOB_OBJECT_LIMIT_JOB_MEMORY
| JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION;
SetInformationJobObject(hJob, JobObjectExtendedLimitInformation, &lim,sizeof(lim));
JOBOBJECT_BASIC_UI_RESTRICTIONS uiLim;
uiLim.UIRestrictionsClass = JOB_OBJECT_UILIMIT_EXITWINDOWS //限制用户进程进行关机,更改本机设置
| JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS //限制更改系统变量
| JOB_OBJECT_UILIMIT_HANDLES //不能访问外部进程对象
| JOB_OBJECT_UILIMIT_DESKTOP //创建窗口
| JOB_OBJECT_UILIMIT_DISPLAYSETTINGS;
SetInformationJobObject(hJob, JobObjectBasicUIRestrictions, &uiLim,sizeof(uiLim));
JOBOBJECT_ASSOCIATE_COMPLETION_PORT info_port;
//建立作业完成端口,因为作业对象要与完成端口相关联
HANDLE port = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, 0);
info_port.CompletionPort = port;
cout<<SetInformationJobObject(hJob, JobObjectAssociateCompletionPortInformation,&info_port, sizeof(info_port));
cout<<AssignProcessToJobObject(hJob, piProcInfo.hProcess);//用户进程与作业对象关联起来,这样就可以利用作业对象来限制用户进程
cout<<ResumeThread(piProcInfo.hThread);//唤醒用户线程
cout<<CloseHandle(piProcInfo.hThread);
return 0;
}