对作业中进程一些操作

来源:互联网 发布:淘宝女装便宜好看店铺 编辑:程序博客网 时间:2024/05/16 11:37
1、Windows提供了一个作业(job)内核对象,它允许我们将进程组合在一起并创建一个“沙箱”来限制进程能够做什么。
2、可以把作业对象想像成一个进程容器,创建只包含一个进程的作业同样有用,因为这样可以对进程施加平时不能施加的限制。
3、IsProcessInJob(HANDLE hProcess,HANDLE hJob, PBOOL pbInJob);判断是否与一个作业相关联,在msdn上找不到太多资料,估计只是在windows vista中有吧。
4、HANDLE CreateJobObject(PSECURITY_ATTRIBYTES psa,PCTSTR pszName);创建一个新的作业内核对象。
5、OpenJobObject(DWORD dwDesiredAccess,BOOL bInheritHandle,PCTSTR pszName);用来访问一个作业内核对象。
6、关闭作业的句柄会导致所有进程都不可以访问此作业,即使这个作业仍然存在。

7、对作业中的进程施加限制-----几种类型的限制:
    1)、基本限制和扩展基本限制,用于防止作业中的进程独占系统资源。
    2)、基本的UI限制,用于防止作业内的进程更改用户界面。
    3)、安全限额,用于防止作业内的进程访问安全资源(文件、注册表子项等)。
8、BOOL SetInformationJobObject(HANDLE hJob,JOBOBJECTINFOCLASS JobObjectInformationClass,PVOID pJobObjectInformation,DWORD cbJobObjectInformationSize);
    通过调用该函数向作业施加限制。第一个参数是指定要限制的作业。第二个参数是一个枚举类型,指定了要施加的限制类型。
    第三个参数是一个数据结构地址,包含具体的限制设置,第四个数据结构大小。
9、限制类型与对应的数据结构:
    JobObjectBasicLimitInformation-------------JOBOBJECT_BASIC_LIMIT_INFORMATION(基本限额)
    JobObjectExtendedLimitInformation----------JOBOBJECT_EXTENDED_LIMIT_INFORMATION(扩展后的基本限额)
    JobObjectBasicUIRestrictions---------------JOBOBJECT_BASIC_UI_RESTRICTIONS(基本的UI限制)
    JobObjectSecurityLimitInformation----------JOBOBJECT_SECURITY_LIMIT_INFORMATION(安全限制)
    
10、可以通过下面的函数查询限制
    BOOL QueryInformationJobObject(HANDLE hJob,JOBOBJECTINFOCLASS JobObjectInformationClass,PVOID pvJobObjectInformation,
DWORD cbJobObjectInformationSize,PDWORD pdwReturnSize);

typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION {  LARGE_INTEGER PerProcessUserTimeLimit;//分配给每个进程的最大用户模式时间  LARGE_INTEGER PerJobUserTimeLimit;//限制分配给作业对象的最大用户模式时间  DWORD         LimitFlags;//指定将哪些限制应用于作业  SIZE_T        MinimumWorkingSetSize;//指定每个进程的最小工作集  SIZE_T        MaximumWorkingSetSize;//指定每个进程的最大工作集  DWORD         ActiveProcessLimit;//指定作业中能并发运行的进程的最大数量  ULONG_PTR     Affinity;//指定能够运行进程的CPU子集  DWORD         PriorityClass;//指定关联的所有进程的优先集  DWORD         SchedulingClass;//为作业中的线程指定一个相对时间量差} JOBOBJECT_BASIC_LIMIT_INFORMATION, *PJOBOBJECT_BASIC_LIMIT_INFORMATION;typedef struct _JOBOBJECT_EXTENDED_LIMIT_INFORMATION {  JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation;//基本的,就是上面那个结构体  IO_COUNTERS                       IoInfo;//保留成员,不应以任何方式访问  SIZE_T                            ProcessMemoryLimit;//只读,进程所需的存储空间的峰值  SIZE_T                            JobMemoryLimit;//只读,全部进程所需的存储空间的峰值  SIZE_T                            PeakProcessMemoryUsed;//作业中任何一个进程所使用的已调拨的存储空间。  SIZE_T                            PeakJobMemoryUsed;//作业中所有进程所使用的已调拨的存储空间。} JOBOBJECT_EXTENDED_LIMIT_INFORMATION, *PJOBOBJECT_EXTENDED_LIMIT_INFORMATION;typedef struct _JOBOBJECT_BASIC_UI_RESTRICTIONS {  DWORD UIRestrictionsClass;//标志位} JOBOBJECT_BASIC_UI_RESTRICTIONS, *PJOBOBJECT_BASIC_UI_RESTRICTIONS;typedef struct _JOBOBJECT_SECURITY_LIMIT_INFORMATION {  DWORD             SecurityLimitFlags;//是否不允许程序员访问  HANDLE            JobToken;//由作业中所有进程使用的访问令牌  PTOKEN_GROUPS     SidsToDisable;//指定要禁止对哪些SID进行访问检查  PTOKEN_PRIVILEGES PrivilegesToDelete;//指定从访问令牌中删除哪些特权  PTOKEN_GROUPS     RestrictedSids;//指定将一组只能拒绝的SID} JOBOBJECT_SECURITY_LIMIT_INFORMATION, *PJOBOBJECT_SECURITY_LIMIT_INFORMATION;