AssignProcessToJobObject 函数 (jobapi2.h)

将进程分配给现有作业对象。

语法

BOOL AssignProcessToJobObject(
  [in] HANDLE hJob,
  [in] HANDLE hProcess
);

parameters

[in] hJob

进程将关联的作业对象的句柄。 CreateJobObjectOpenJobObject 函数返回此句柄。 句柄必须具有JOB_OBJECT_ASSIGN_PROCESS访问权限。 有关详细信息,请参阅 作业对象安全和访问权限

[in] hProcess

要与作业对象关联的进程的句柄。 句柄必须具有PROCESS_SET_QUOTA和PROCESS_TERMINATE访问权限。 有关详细信息,请参阅 进程安全和访问权限

如果进程已与作业关联,则 hJob 指定的作业必须为空,或者它必须位于进程已属于的嵌套作业层次结构中,并且它不能将 UI 限制 (SetInformationJobObjectJobObjectBasicUIRestrictions) 。 有关详细信息,请参阅“备注”。

Windows 7、Windows Server 2008 R2、Windows XP SP3、Windows Server 2008、Windows Vista 和 Windows Server 2003: 进程不得已分配给作业;如果为 ,则函数将失败并ERROR_ACCESS_DENIED。 从 Windows 8 和 Windows Server 2012 开始,此行为已更改。

终端服务: 作业中的所有进程必须在与作业相同的会话中运行。

返回值

如果该函数成功,则返回值为非零值。

如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。

注解

使用 AssignProcessToJobObject 将进程与作业对象关联后,进程将受到为作业设置的限制。 若要为作业设置限制,请使用 SetInformationJobObject 函数。

如果作业具有用户模式时间限制,并且该时间限制已用尽, 则 AssignProcessToJobObject 将失败并终止指定的进程。 如果通过关联进程超出时间限制, AssignProcessToJobObject 仍会成功。 但是,将报告违反时间限制的情况。 如果作业具有活动进程限制,并且通过关联此进程将超出该限制, 则 AssignProcessToJobObject 将失败,并且指定的进程将终止。

与具有内存限制的作业关联的进程执行的内存操作受内存限制的约束。 AssignProcessToJobObject 不会检查进程在与作业关联之前执行的内存操作。

如果进程已在运行并且作业存在安全限制, AssignProcessToJobObject 可能会失败。 例如,如果进程的主令牌包含本地管理员组,但作业对象JOB_OBJECT_SECURITY_NO_ADMIN具有安全限制,则函数将失败。 如果作业具有JOB_OBJECT_SECURITY_ONLY_TOKEN安全限制,则必须暂停创建进程。 若要创建挂起的进程,请使用 CREATE_SUSPENDED 标志调用 CreateProcess 函数。

一个进程可以与嵌套作业层次结构中的多个作业相关联。 对于优先级类、相关性、提交费用、每个进程执行时间限制、计划类限制以及工作集最小值和最大值,进程将继承有效限制,这是其父作业链中所有作业的最严格限制。 对于其他资源限制,进程会从层次结构中的直接作业继承限制。 会计信息将添加到即时作业,并在作业链中的每个父作业中聚合。 默认情况下,所有子进程都与直接作业和父作业链中的每个作业相关联。 若要创建不属于同一作业链的子进程,请使用 CREATE_BREAKAWAY_FROM_JOB 标志调用 CreateProcess 函数。 除非链中的作业不允许分离,否则子进程会脱离作业链中的每个作业。 在这种情况下,子进程不会脱离作业链中该作业或其上的任何作业。 有关详细信息,请参阅 嵌套作业

Windows 7、Windows Server 2008 R2、Windows XP SP3、Windows Server 2008、Windows Vista 和 Windows Server 2003: 一个进程只能与单个作业相关联。 进程从与其关联的作业继承限制,并将其记帐信息添加到作业。 如果进程与作业相关联,则默认情况下,它创建的所有子进程都与该作业相关联。 若要创建不属于同一作业的子进程,请使用 CREATE_BREAKAWAY_FROM_JOB 标志调用 CreateProcess 函数。 从 Windows 8 和 Windows Server 2012 开始,一个进程可以与多个作业相关联。

Windows 7、Windows Server 2008 R2、Windows Server 2008 和 Windows Vista: 如果程序兼容性助手 (PCA) 监视进程,则会将其置于兼容性作业中。 因此,必须先使用 CREATE_BREAKAWAY_FROM_JOB 创建进程,然后才能将其置于另一个作业中。 或者,可以在应用程序中嵌入指定用户帐户控制 (UAC) 级别的应用程序清单,PCA 不会将进程添加到兼容性作业。 有关详细信息,请参阅 用户帐户控制兼容性的应用程序开发要求

如果在调用 AssignProcessToJob 时作业或其作业链中的任何父作业终止,该函数将失败。

若要编译使用此函数的应用程序,请将_WIN32_WINNT定义为 0x0500 或更高版本。 有关详细信息,请参阅 使用 Windows 标头

要求

   
最低受支持的客户端 Windows XP [仅限桌面应用]
最低受支持的服务器 Windows Server 2003 [仅限桌面应用]
目标平台 Windows
标头 jobapi2.h (包括 Windows.h)
Library Kernel32.lib
DLL Kernel32.dll

另请参阅

CreateJobObject

CreateProcess

作业对象

OpenJobObject

进程和线程函数

SetInformationJobObject