AssignProcessToJobObject 関数 (jobapi2.h)

既存のジョブ オブジェクトにプロセスを割り当てます。

構文

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

パラメーター

[in] hJob

プロセスが関連付けられるジョブ オブジェクトへのハンドル。 CreateJobObject または OpenJobObject 関数は、このハンドルを返します。 ハンドルには、JOB_OBJECT_ASSIGN_PROCESSアクセス権が必要です。 詳細については、「 ジョブ オブジェクトのセキュリティとアクセス権」を参照してください。

[in] hProcess

ジョブ オブジェクトに関連付けるプロセスのハンドル。 ハンドルには、PROCESS_SET_QUOTAとPROCESS_TERMINATEアクセス権が必要です。 詳細については、「 セキュリティとアクセス権の処理」を参照してください。

プロセスが既にジョブに関連付けられている場合は、hJob で指定されたジョブが空であるか、プロセスが既に属している入れ子になったジョブの階層にある必要があります。また、UI 制限を設定することはできません (JobObjectBasicUIRestrictions を使用した SetInformationJobObject)。 詳細については、「解説」を参照してください。

Windows 7、Windows Server 2008 R2、Windows XP with SP3、Windows Server 2008、Windows Vista、Windows Server 2003: プロセスをジョブにまだ割り当ててはいけません。その場合、関数は ERROR_ACCESS_DENIED で失敗します。 この動作は、Windows 8 および Windows Server 2012 以降で変更されました。

ターミナル サービス: ジョブ内のすべてのプロセスは、ジョブと同じセッション内で実行する必要があります。

戻り値

関数が成功すると、戻り値は 0 以外になります。

関数が失敗した場合は、0 を返します。 詳細なエラー情報を得るには、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 with SP3、Windows Server 2008、Windows Vista、Windows Server 2003: プロセスは、1 つのジョブにのみ関連付けることができます。 プロセスは、関連付けられているジョブから制限を継承し、そのアカウンティング情報をジョブに追加します。 プロセスがジョブに関連付けられている場合、作成されるすべての子プロセスは、既定でそのジョブに関連付けられます。 同じジョブに含まれていない子プロセスを作成するには、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