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;
}