Windows作业(Job)


  1 Windows作业

    实际是一个进程组. 可以对作业设置权限,一旦
    进程加入到作业之内,进程的权限将被作业限制.
    

  2 作业的使用

    需要NT5.0以上支持,所有在Windows.h前定义 
      #define _WIN32_WINNT 0x0500

    2.1 创建一个作业

     HANDLE CreateJobObject(
       LPSECURITY_ATTRIBUTES lpJobAttributes,
        // 安全属性
       LPCTSTR lpName ); //名称
     返回创建的Job句柄

    2.2 设置作业权限

     BOOL SetInformationJobObject(
      HANDLE hJob,//Job句柄
JOBOBJECTINFOCLASS JobObjectInformationClass,
       //Job权限的类型
LPVOID lpJobObjectInformation,
       //类型所对应的数据结构的地址
DWORD cbJobObjectInformationLength
       //类型所对应的数据结构的长度
);

    2.3 将进程加入作业

       BOOL AssignProcessToJobObject(
        HANDLE hJob, //作业句柄
        HANDLE hProcess );//进程句柄

    2.4 关闭作业

       CloseHandle(作业内的进程等不会被结束,权限限制依然存在)

    2.5 结束作业(同时结束作业内的进程)

       使用TerminateJobObject结束作业.
       但是并不是所有情况下,作业内的进程

       都能被结束.(级别高的进程杀不掉)


// WinJob.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "conio.h"

#define _WIN32_WINNT 0x0500

#include "windows.h"

HANDLE Create( LPSTR pszPath )
{
	STARTUPINFO si = { 0 };
	PROCESS_INFORMATION pi = { 0 };
	si.cb = sizeof( si );
	CreateProcess( pszPath,
		NULL, NULL, NULL, FALSE, 0,
		NULL, NULL, &si, &pi );
	return pi.hProcess;
}

void Job( )
{	//创建Job对象
	HANDLE hJob = 
		CreateJobObject( NULL, "MyJob" );
	//设置权限
	JOBOBJECT_BASIC_UI_RESTRICTIONS ui = {0};
	ui.UIRestrictionsClass = 
		JOB_OBJECT_UILIMIT_READCLIPBOARD|
		JOB_OBJECT_UILIMIT_WRITECLIPBOARD;
	SetInformationJobObject( hJob,
	  JobObjectBasicUIRestrictions,
	  &ui, sizeof(ui) );
	//创建进程
	HANDLE hProc = Create( 
		"c:\\windows\\system32\\mspaint.exe" );
	//将进程加入作业
	AssignProcessToJobObject( 
		hJob, hProc );

	hProc = Create( 
		"c:\\windows\\system32\\mspaint.exe" );
	AssignProcessToJobObject( 
		hJob, hProc );

	getch( );
	//结束作业
	TerminateJobObject( hJob, 0 );
	//关闭Job
	CloseHandle( hJob );
}

int main(int argc, char* argv[])
{
	Job( );
	return 0;
}


你可能感兴趣的:(job,CreateJobObject,windows作业)