Auftragsobjekte

Ein Auftragsobjekt ermöglicht die Verwaltung von Gruppen von Prozessen als Einheit. Auftragsobjekte sind namable, sicherungsfähige, Sharable-Objekte, die Attribute der ihnen zugeordneten Prozesse steuern. Vorgänge für ein Auftragsobjekt wirken sich auf alle Prozesse aus, die dem Auftragsobjekt zugeordnet sind. Beispiele hierfür sind das Erzwingen von Grenzwerten, z. B. die Größe des Arbeitssatzes und die Prozesspriorität oder das Beenden aller Prozesse, die einem Auftrag zugeordnet sind.

Erstellen von Aufträgen

Verwenden Sie zum Erstellen eines Auftragsobjekts die Funktion CreateJobObject . Wenn der Auftrag erstellt wird, sind dem Auftrag keine Prozesse zugeordnet.

Um einem Auftrag einen Prozess zuzuordnen, verwenden Sie die Funktion AssignProcessToJobObject . Nachdem ein Prozess einem Auftrag zugeordnet ist, kann die Zuordnung nicht unterbrochen werden. Ein Prozess kann mehreren Aufträgen in einer Hierarchie geschachtelter Aufträge zugeordnet sein. Weitere Informationen finden Sie unter Geschachtelte Aufträge.

Windows 7, Windows Server 2008 R2, Windows XP mit SP3, Windows Server 2008, Windows Vista und Windows Server 2003: Ein Prozess kann nur einem Auftrag zugeordnet werden. Aufträge können nicht geschachtelt werden. Die Möglichkeit zum Schachteln von Aufträgen wurde in Windows 8 und Windows Server 2012 hinzugefügt.

Sie können einen Sicherheitsdeskriptor für ein Auftragsobjekt angeben, wenn Sie die CreateJobObject-Funktion aufrufen. Weitere Informationen finden Sie unter Auftragsobjektsicherheit und Zugriffsrechte.

Verwalten von Prozessen in Aufträgen

Nachdem ein Prozess einem Auftrag zugeordnet ist, werden standardmäßig alle untergeordneten Prozesse, die mit CreateProcess erstellt werden, dem Auftrag zugeordnet. (Untergeordnete Prozesse, die mit Win32_Process.Create erstellt wurden, sind dem Auftrag nicht zugeordnet.) Dieses Standardverhalten kann durch Festlegen des erweiterten Grenzwerts JOB_OBJECT_LIMIT_BREAKAWAY_OK oder JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK für den Auftrag geändert werden.

  • Wenn der Auftrag über den erweiterten Grenzwert JOB_OBJECT_LIMIT_BREAKAWAY_OK verfügt und der übergeordnete Prozess mit dem flag CREATE_BREAKAWAY_FROM_JOB erstellt wurde, werden dem Auftrag keine untergeordneten Prozesse des übergeordneten Prozesses zugeordnet.
  • Wenn der Auftrag den erweiterten Grenzwert JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK aufweist, werden dem Auftrag keine untergeordneten Prozesse eines übergeordneten Prozesses zugeordnet. Übergeordnete Prozesse müssen nicht mit dem Flag CREATE_BREAKAWAY_FROM_JOB erstellt werden.

Wenn der Auftrag geschachtelt ist, wirken sich die Trennungseinstellungen übergeordneter Aufträge in der Hierarchie darauf aus, ob untergeordnete Prozesse einem anderen Auftrag in der Hierarchie zugeordnet sind. Weitere Informationen finden Sie unter Geschachtelte Aufträge.

Um zu bestimmen, ob ein Prozess in einem Auftrag ausgeführt wird, verwenden Sie die IsProcessInJob-Funktion .

Um alle Prozesse zu beenden, die derzeit einem Auftragsobjekt zugeordnet sind, verwenden Sie die Funktion TerminateJobObject .

Auftragslimits und Benachrichtigungen

Ein Auftrag kann Grenzwerte wie Die Größe des Arbeitssatzes, die Prozesspriorität und das Zeitlimit für das Ende des Auftrags für jeden Prozess erzwingen, der dem Auftrag zugeordnet ist. Wenn ein Einem Auftrag zugeordneter Prozess versucht, seine Arbeitssatzgröße oder Prozesspriorität von dem vom Auftrag festgelegten Grenzwert zu erhöhen, wird die Funktion zwar erfolgreich aufgerufen, aber automatisch ignoriert. Ein Auftrag kann auch Grenzwerte festlegen, die eine Benachrichtigung auslösen, wenn sie überschritten werden, aber zulassen, dass der Auftrag weiterhin ausgeführt wird.

Um Grenzwerte für einen Auftrag festzulegen, verwenden Sie die Funktion SetInformationJobObject . Eine Liste der möglichen Grenzwerte, die für einen Auftrag festgelegt werden können, finden Sie in den folgenden Themen:

Sicherheitsgrenzwerte müssen für jeden Prozess festgelegt werden, der einem Auftragsobjekt zugeordnet ist. Weitere Informationen finden Sie unter Prozesssicherheit und Zugriffsrechte.

Windows XP mit SP3 und Windows Server 2003: Die SetInformationJobObject-Funktion kann verwendet werden, um Sicherheitsbeschränkungen für alle Prozesse festzulegen, die einem Auftragsobjekt zugeordnet sind. Ab Windows Vista müssen Sicherheitsgrenzwerte für jeden Prozess, der einem Auftragsobjekt zugeordnet ist, einzeln festgelegt werden.

Wenn der Auftrag geschachtelt ist, beeinflussen übergeordnete Aufträge in der Hierarchie den Grenzwert, der für den Auftrag erzwungen wird. Weitere Informationen finden Sie unter Geschachtelte Aufträge.

Wenn der Auftrag über einen zugeordneten E/A-Abschlussport verfügt, kann er Benachrichtigungen erhalten, wenn bestimmte Auftragsgrenzwerte überschritten werden. Das System sendet Nachrichten an den Vervollständigungsport, wenn ein Grenzwert überschritten wird oder bestimmte andere Ereignisse auftreten. Um einem Auftrag einen Vervollständigungsport zuzuordnen, verwenden Sie die SetInformationJobObject-Funktion mit der Auftragsobjektinformationsklasse JobObjectAssociateCompletionPortInformation und einem Zeiger auf eine JOBOBJECT_ASSOCIATE_COMPLETION_PORT-Struktur . Dies ist am besten zu tun, wenn der Auftrag inaktiv ist, um das Risiko fehlender Benachrichtigungen für Prozesse zu verringern, deren Zustände sich während der Zuordnung des Abschlussports ändern.

Alle Nachrichten werden direkt vom Auftrag gesendet, als hätte der Auftrag die Funktion PostQueuedCompletionStatus aufgerufen. Ein Thread muss den Vervollständigungsport mithilfe der GetQueuedCompletionStatus-Funktion überwachen, um die Nachrichten aufzunehmen. Beachten Sie, dass mit Ausnahme der Grenzwerte, die mit der Informationsklasse JobObjectNotificationLimitInformation festgelegt wurden, die Übermittlung von Nachrichten an den Vervollständigungsport nicht garantiert ist. Wenn eine Nachricht nicht eingeht, bedeutet das nicht unbedingt, dass das Ereignis nicht aufgetreten ist. Benachrichtigungen für mit JobObjectNotificationLimitInformation festgelegte Grenzwerte werden garantiert am Abschlussport eintreffen. Eine Liste der möglichen Nachrichten finden Sie unter JOBOBJECT_ASSOCIATE_COMPLETION_PORT.

Ressourcenbuchhaltung für Aufträge

Das Auftragsobjekt zeichnet grundlegende Buchhaltungsinformationen für alle zugeordneten Prozesse auf, einschließlich der prozesse, die beendet wurden. Verwenden Sie zum Abrufen dieser Buchhaltungsinformationen die Funktion QueryInformationJobObject . Eine Liste der Buchhaltungsinformationen, die für einen Auftrag verwaltet werden, finden Sie in den folgenden Themen:

Wenn das Auftragsobjekt geschachtelt ist, werden die Abrechnungsinformationen für jeden untergeordneten Auftrag im übergeordneten Auftrag aggregiert. Weitere Informationen finden Sie unter Geschachtelte Aufträge.

Verwalten von Auftragsobjekten

Der Status eines Auftragsobjekts wird auf signalisiert festgelegt, wenn alle prozesse beendet werden, da das angegebene Zeitlimit zum Ende des Auftrags überschritten wurde. Verwenden Sie WaitForSingleObject oder WaitForSingleObjectEx , um das Auftragsobjekt für dieses Ereignis zu überwachen.

Um ein Handle für ein vorhandenes Auftragsobjekt abzurufen, verwenden Sie die OpenJobObject-Funktion , und geben Sie den Namen an, der dem Objekt bei der Erstellung gegeben wurde. Es können nur benannte Auftragsobjekte geöffnet werden.

Um ein Auftragsobjekthandle zu schließen, verwenden Sie die CloseHandle-Funktion . Der Auftrag wird zerstört, wenn der letzte Handle geschlossen und alle zugehörigen Prozesse beendet wurden. Wenn für den Auftrag jedoch das flag JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE angegeben ist, beendet das Schließen des letzten Auftragsobjekthandles alle zugeordneten Prozesse und zerstört dann das Auftragsobjekt selbst. Wenn für einen geschachtelten Auftrag das Flag JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE angegeben ist, werden beim Schließen des letzten Auftragsobjekthandles alle Prozesse beendet, die dem Auftrag und seinen untergeordneten Aufträgen in der Hierarchie zugeordnet sind.

Verwalten einer Prozessstruktur, die Auftragsobjekte verwendet

Ab Windows 8 und Windows Server 2012 kann eine Anwendung geschachtelte Aufträge verwenden, um eine Prozessstruktur zu verwalten, die mehrere Auftragsobjekte verwendet. Eine Anwendung, die unter Windows 7, Windows Server 2008 R2 oder früheren Versionen von Windows ausgeführt werden muss, die keine geschachtelten Aufträge unterstützen, muss die Prozessstruktur jedoch auf andere Weise verwalten.

Wenn ein Tool eine Prozessstruktur verwalten muss, die Auftragsobjekte verwendet, und es nicht möglich ist, geschachtelte Aufträge zu verwenden, müssen sowohl das Tool als auch die Elemente der Prozessstruktur zusammenarbeiten. Nutzen Sie eine der folgenden Optionen:

  • Verwenden Sie das JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK-Limit. Wenn das Tool diesen Grenzwert verwendet, kann es keine gesamte Prozessstruktur überwachen. Das Tool kann nur die Prozesse überwachen, die es dem Auftrag hinzufügt. Wenn diese Prozesse untergeordnete Prozesse erstellen, sind sie nicht dem Auftrag zugeordnet. In dieser Option können untergeordnete Prozesse anderen Auftragsobjekten zugeordnet werden.

  • Verwenden Sie das JOB_OBJECT_LIMIT_BREAKAWAY_OK-Limit. Wenn das Tool diesen Grenzwert verwendet, kann es die gesamte Prozessstruktur überwachen, mit Ausnahme der Prozesse, die von jedem Element der Struktur explizit getrennt werden. Ein Mitglied der Struktur kann einen untergeordneten Prozess in einem neuen Auftragsobjekt erstellen, indem die CreateProcess-Funktion mit dem CREATE_BREAKAWAY_FROM_JOB-Flag aufgerufen und dann die AssignProcessToJobObject-Funktion aufgerufen wird . Andernfalls muss das Element Fälle behandeln, in denen AssignProcessToJobObject fehlschlägt .

    Das CREATE_BREAKAWAY_FROM_JOB-Flag hat keine Auswirkung, wenn die Struktur nicht vom Tool überwacht wird. Daher ist dies die bevorzugte Option, erfordert jedoch eine vorgängige Kenntnis der überwachten Prozesse.

  • Verhindern Sie Unterbrechungen jeglicher Art, indem Sie weder das JOB_OBJECT_LIMIT_BREAKAWAY_OK noch das JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK-Limit festlegen. In dieser Option kann das Tool die gesamte Prozessstruktur überwachen. Wenn ein untergeordneter Prozess jedoch versucht, sich selbst oder ein anderer untergeordneter Prozess einem Auftrag durch Aufrufen von AssignProcessToJobObject zuzuordnen, schlägt der Aufruf fehl. Wenn der Prozess so konzipiert wurde, dass er einem bestimmten Auftrag zugeordnet ist, kann dieser Fehler verhindern, dass der Prozess ordnungsgemäß funktioniert.