Dela via


Jobbobjekt

Ett jobbobjekt gör att grupper av processer kan hanteras som en enhet. Jobbobjekt är namable, securable, sharable objects that control attributes of the processes associated with them.Job objects are namable, securable, sharable objects that control attributes of the processes associated with them. Åtgärder som utförs på ett jobbobjekt påverkar alla processer som är associerade med jobbobjektet. Exempel är att framtvinga begränsningar som arbetsuppsättningens storlek och processprioritet eller avsluta alla processer som är associerade med ett jobb.

Skapa jobb

Om du vill skapa ett jobbobjekt använder du funktionen CreateJobObject. När jobbet skapas associeras inga processer med jobbet.

Om du vill associera en process med ett jobb använder du funktionen AssignProcessToJobObject. När en process har associerats med ett jobb kan associationen inte brytas. En process kan associeras med fler än ett jobb i en hierarki med kapslade jobb. Mer information finns i Kapslade jobb.

Windows 7, Windows Server 2008 R2, Windows XP med SP3, Windows Server 2008, Windows Vista och Windows Server 2003: En process kan bara associeras med ett jobb. Jobb kan inte kapslas. Möjligheten att kapsla jobb har lagts till i Windows 8 och Windows Server 2012.

Du kan ange en säkerhetsbeskrivning för ett jobbobjekt när du anropar funktionen CreateJobObject. Mer information finns i Säkerhet för jobbobjekt och åtkomsträttigheter.

Hantera processer i jobb

När en process har associerats med ett jobb associeras alla underordnade processer som skapas med CreateProcess- också med jobbet. (Underordnade processer som skapats med Win32_Process.Skapa är inte associerade med jobbet.) Det här standardbeteendet kan ändras genom att ange den utökade gränsen JOB_OBJECT_LIMIT_BREAKAWAY_OK eller JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK för jobbet.

  • Om jobbet har den utökade gränsen JOB_OBJECT_LIMIT_BREAKAWAY_OK och den överordnade processen skapades med flaggan CREATE_BREAKAWAY_FROM_JOB associeras inte underordnade processer i den överordnade processen med jobbet.
  • Om jobbet har den utökade gränsen JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK associeras inte underordnade processer i någon överordnad process som är associerad med jobbet med jobbet. Det är inte nödvändigt att överordnade processer skapas med flaggan CREATE_BREAKAWAY_FROM_JOB.

Om jobbet är kapslat påverkar utbrytarinställningarna för överordnade jobb i hierarkin om underordnade processer är associerade med ett annat jobb i hierarkin. Mer information finns i Kapslade jobb.

Om du vill ta reda på om en process körs i ett jobb använder du funktionen IsProcessInJob.

Om du vill avsluta alla processer som för närvarande är associerade med ett jobbobjekt använder du funktionen TerminateJobObject.

Jobbgränser och meddelanden

Ett jobb kan framtvinga begränsningar som arbetsuppsättningens storlek, processprioritet och tidsgräns för jobbslut för varje process som är associerad med jobbet. Om en process som är associerad med ett jobb försöker öka arbetsuppsättningens storlek eller processprioritet från den gräns som fastställs av jobbet, anropar funktionen lyckas men ignoreras tyst. Ett jobb kan också ange gränser som utlöser ett meddelande när de överskrids men tillåter att jobbet fortsätter att köras.

Om du vill ange gränser för ett jobb använder du funktionen SetInformationJobObject. En lista över möjliga gränser som kan anges för ett jobb finns i följande avsnitt:

Säkerhetsgränser måste anges individuellt för varje process som är associerad med ett jobbobjekt. Mer information finns i Process Security and Access Rights.

Windows XP med SP3 och Windows Server 2003: Funktionen SetInformationJobObject kan användas för att ange säkerhetsbegränsningar för alla processer som är associerade med ett jobbobjekt. Från och med Windows Vista måste säkerhetsgränser anges individuellt för varje process som är associerad med ett jobbobjekt.

Om jobbet är kapslat påverkar överordnade jobb i hierarkin den gräns som tillämpas för jobbet. Mer information finns i Kapslade jobb.

Om jobbet har en associerad I/O-slutförandeport kan det ta emot meddelanden när vissa jobbgränser överskrids. Systemet skickar meddelanden till slutförandeporten när en gräns överskrids eller vissa andra händelser inträffar. Om du vill associera en slutförandeport med ett jobb använder du funktionen SetInformationJobObject med informationsklassen jobbobjekt JobObjectAssociateCompletionPortInformation och en pekare till en JOBOBJECT_ASSOCIATE_COMPLETION_PORT struktur. Det är bäst att göra detta när jobbet är inaktivt, för att minska risken för att meddelanden saknas för processer vars tillstånd ändras under associationen för slutförandeporten.

Alla meddelanden skickas direkt från jobbet som om jobbet hade anropat funktionen PostQueuedCompletionStatus. En tråd måste övervaka slutförandeporten med hjälp av funktionen GetQueuedCompletionStatus för att kunna hämta meddelandena. Observera att med undantag för gränser som anges med JobObjectNotificationLimitInformation informationsklass, garanteras inte leverans av meddelanden till slutförandeporten. att ett meddelande inte har skickats betyder inte nödvändigtvis att händelsen inte inträffade. Meddelanden om gränser som anges med JobObjectNotificationLimitInformation kommer garanterat att komma fram till slutförandeporten. En lista över möjliga meddelanden finns i JOBOBJECT_ASSOCIATE_COMPLETION_PORT.

Resursredovisning för jobb

Jobbobjektet registrerar grundläggande redovisningsinformation för alla associerade processer, inklusive de som har avslutats. Om du vill hämta den här redovisningsinformationen använder du funktionen QueryInformationJobObject. En lista över redovisningsinformationen som underhålls för ett jobb finns i följande avsnitt:

Om jobbobjektet är kapslat aggregeras redovisningsinformationen för varje underordnat jobb i det överordnade jobbet. Mer information finns i Kapslade jobb.

Hantera jobbobjekt

Tillståndet för ett jobbobjekt anges till signalerat när alla dess processer avslutas eftersom den angivna tidsgränsen för jobbslut har överskridits. Använd WaitForSingleObject eller WaitForSingleObjectEx för att övervaka jobbobjektet för den här händelsen.

Om du vill hämta ett handtag för ett befintligt jobbobjekt använder du funktionen OpenJobObject och anger namnet som angavs för objektet när det skapades. Endast namngivna jobbobjekt kan öppnas.

Om du vill stänga ett jobbobjektreferens använder du funktionen CloseHandle. Jobbet förstörs när dess sista handtag har stängts och alla associerade processer har avslutats. Men om jobbet har den JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE flagga som angetts avslutar stängningen av det sista jobbobjekthandtaget alla associerade processer och förstör sedan själva jobbobjektet. Om ett kapslat jobb har angett JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE flagga avslutas alla processer som är associerade med jobbet och dess underordnade jobb i hierarkin om du stänger det sista jobbobjektshandtaget.

Hantera ett processträd som använder jobbobjekt

Från och med Windows 8 och Windows Server 2012 kan ett program använda kapslade jobb för att hantera ett processträd som använder mer än ett jobbobjekt. Ett program som måste köras på Windows 7, Windows Server 2008 R2 eller tidigare versioner av Windows som inte stöder kapslade jobb måste dock hantera processträdet på andra sätt.

Om ett verktyg måste hantera ett processträd som använder jobbobjekt och det inte går att använda kapslade jobb måste både verktyget och medlemmarna i processträdet samarbeta. Använd något av följande alternativ:

  • Använd gränsen för JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK. Om verktyget använder den här gränsen kan det inte övervaka ett helt processträd. Verktyget kan endast övervaka de processer som läggs till i jobbet. Om dessa processer skapar underordnade processer associeras de inte med jobbet. I det här alternativet kan underordnade processer associeras med andra jobbobjekt.

  • Använd gränsen för JOB_OBJECT_LIMIT_BREAKAWAY_OK. Om verktyget använder den här gränsen kan det övervaka hela processträdet, förutom de processer som alla medlemmar i trädet uttryckligen bryter sig bort från trädet. En medlem i trädet kan skapa en underordnad process i ett nytt jobbobjekt genom att anropa funktionen CreateProcess med flaggan CREATE_BREAKAWAY_FROM_JOB och sedan anropa funktionen AssignProcessToJobObject. Annars måste medlemmen hantera fall där AssignProcessToJobObject misslyckas.

    Flaggan CREATE_BREAKAWAY_FROM_JOB har ingen effekt om trädet inte övervakas av verktyget. Det här är därför det bästa alternativet, men det kräver förkunskaper om de processer som övervakas.

  • Förhindra utbrytningar av något slag genom att varken ange JOB_OBJECT_LIMIT_BREAKAWAY_OK eller gränsen för JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK. I det här alternativet kan verktyget övervaka hela processträdet. Men om en underordnad process försöker associera sig själv eller en annan underordnad process med ett jobb genom att anropa AssignProcessToJobObjectmisslyckas anropet. Om processen har utformats för att associeras med ett visst jobb kan det här felet hindra processen från att fungera korrekt.