将进程组合在一起,并且创建一个“沙框”,以便限制进程能够进行的操作。最好将作业对象视为一个进程的容器。
CreateJobObject可以创建一个作业内核对象。OpenJobObject可以根据名字访问一个已经创建好的作业内核对象。CloseHandle可以关闭作业内核对象。关闭作业对象并不会迫使作业中的所有进程终止运行。该作业对象实际上做上了删除标记,只有当作业中的所有进程全部终止运行之后,该作业对象才被自动撤消。关闭作业的句柄后,尽管该作业仍然存在,但是该作业将无法被所有进程访问。
对作业进程的限制
SetInformationJobObject可以给一个作业加上若干不同类型的限制:
- 基本限制和扩展基本限制,用于防止作业中的进程垄断系统的资源。
- 基本的UI限制,用于防止作业中的进程改变用户界面。
- 安全性限制,用于防止作业中的进程访问保密资源(文件、注册表子关键字等)。
将进程放入作业
如果子进程不属于作业,并且创建子进程的时候允许它立刻执行的话,那么它将无法用作业限制该子进程。所以必须:
- 在CreateProcess的时候使用CREATE_SUSPENDED标志。
- 使用AssignProcessToJobObject将进程赋给作业。
- 使用ResumeThread恢复子进程的主线程。
一旦进程成为一个作业的组成部分,它就不能转到另一个作业。另外,当作为作业的一部分的进程生成另一个进程的时候,新进程将自动成为父作业的组成部分(可以通过某些标志位改变这个行为)。
TerminateJobObject可以终止作业中所有进程的运行。