Dela via


Händelser för tjänstutlösare

En tjänst kan registrera sig för att startas eller stoppas när en utlösarhändelse inträffar. Detta eliminerar behovet av att tjänster startar när systemet startar, eller för tjänster att avsöka eller aktivt vänta på en händelse. en tjänst kan starta när den behövs, i stället för att automatiskt starta om det finns arbete att göra eller inte. Exempel på fördefinierade utlösarhändelser är ankomst av en enhet i en angiven enhetsgränssnittsklass eller tillgänglighet för en viss brandväggsport. En tjänst kan också registrera sig för en anpassad utlösarhändelse som genereras av en händelsespårning för Windows-provider (ETW).

Windows Server 2008, Windows Vista, Windows Server 2003 och Windows XP: Tjänstutlösare stöds inte förrän Windows Server 2008 R2 och Windows 7.

En utlösare består av en utlösarhändelsetyp, en utlösarhändelseundertyp, den åtgärd som ska vidtas som svar på utlösarhändelsen och (för vissa typer av utlösare) ett eller flera utlösarspecifika dataobjekt. Undertypen och de utlösarspecifika dataobjekten anger tillsammans villkoren för att meddela tjänsten om händelsen. Formatet för ett dataobjekt beror på utlösarhändelsetypen. ett dataobjekt kan vara binära data, en sträng eller en multistring. Strängar måste vara Unicode; ANSI-strängar stöds inte.

För att registrera sig för utlösarhändelser anropar tjänsten ChangeServiceConfig2 med SERVICE_CONFIG_TRIGGER_INFO och tillhandahåller en SERVICE_TRIGGER_INFO struktur. Den SERVICE_TRIGGER_INFO strukturen pekar på en matris med SERVICE_TRIGGER strukturer som var och en anger en utlösare.

Den angivna utlösaråtgärden vidtas om utlösarvillkoret är sant när systemet startar, eller om utlösarvillkoret blir sant när systemet körs. Om en tjänst till exempel registreras för att startas när en viss enhet är tillgänglig startas tjänsten när systemet startar om enheten redan är ansluten till datorn. tjänsten startas när enheten tas emot om användaren ansluter enheten medan systemet körs.

Om en utlösare har utlösarspecifika dataobjekt vidtas utlösaråtgärden endast om det dataobjekt som medföljer utlösarhändelsen matchar ett av de dataobjekt som tjänsten angav med utlösaren. Matchning av binära data görs genom bitvis jämförelse. Strängmatchning är skiftlägeskänsligt. Om dataobjektet är en multistring måste alla strängar i multistring matcha.

När en tjänst startas som svar på en utlösarhändelse tar tjänsten emot SERVICE_TRIGGER_STARTED_ARGUMENT som argv[1] i sin ServiceMain återanropsfunktion. Argv[0] är alltid tjänstens korta namn.

En tjänst som registrerar sig för att startas som svar på en utlösarhändelse kan stoppa sig själv efter en tidsgräns för inaktivitet när tjänsten inte har något arbete att göra. En tjänst som stoppar sig själv måste vara beredd att hantera SERVICE_CONTROL_TRIGGEREVENT kontrollbegäranden som tas emot medan tjänsten stoppar sig själv. SCM skickar en SERVICE_CONTROL_TRIGGEREVENT kontrollbegäran när en ny utlösarhändelse inträffar när tjänsten körs. För att undvika att utlösarhändelser förloras bör tjänsten returnera ERROR_SHUTDOWN_IN_PROGRESS för alla SERVICE_CONTROL_TRIGGEREVENT kontrollbegäran som tas emot när tjänsten övergår från att köras till stoppad. Detta instruerar SCM att köa utlösarhändelser och vänta tills tjänsten har angett det stoppade tillståndet. SCM vidtar sedan åtgärden som är associerad med den köade utlösarhändelsen, till exempel att starta tjänsten.

När tjänsten är redo att hantera utlösarhändelser igen anger den SERVICE_ACCEPT_TRIGGEREVENT i den mask som accepteras av kontroller i ett anrop till SetServiceStatus. Detta görs vanligtvis när tjänsten anropar SetServiceStatus med SERVICE_RUNNING. SCM utfärdar sedan en SERVICE_CONTROL_TRIGGEREVENT begäran för varje köad utlösarhändelse tills kön är tom.

En tjänst som har beroende tjänster som körs kan inte stoppas som svar på en utlösarhändelse.

Begäranden om start av utlösare och utlösare garanteras inte under låg minnesanvändning.

Använd funktionen QueryServiceConfig2 för att hämta en tjänsts utlösarhändelsekonfiguration.

SC-verktyget (sc.exe) kan användas för att konfigurera eller köra frågor mot en tjänsts utlösarhändelser i kommandotolken. Använd alternativet triggerinfo för att konfigurera en tjänst för att starta eller stoppa som svar på en utlösarhändelse. Använd alternativet qtriggerinfo för att köra frågor mot utlösarkonfigurationen för en tjänst.

I följande exempel efterfrågas utlösarkonfigurationen för W32time-tjänsten, som är konfigurerad för att starta när datorn är ansluten till en domän och stoppas när datorn lämnar domänen.

C:\>sc qtriggerinfo w32time
[SC] QueryServiceConfig2 SUCCESS

SERVICE_NAME: w32time

        START SERVICE
          DOMAIN JOINED STATUS         : 1ce20aba-9851-4421-9430-1ddeb766e809 [DOMAIN JOINED]
        STOP SERVICE
          DOMAIN JOINED STATUS         : ddaf516e-58c2-4866-9574-c3b615d42ea1 [NOT DOMAIN JOINED]

I följande exempel efterfrågas utlösarkonfigurationen för indatatjänsten för surfplattor, som är konfigurerad för att starta när en HID-enhet med GUID- {4d1e55b2-f16f-11cf-88cb-001111000030} och någon av de angivna HID-enhets-ID:n kommer.

C:\>sc qtriggerinfo tabletinputservice
[SC] QueryServiceConfig2 SUCCESS

SERVICE_NAME: tabletinputservice

        START SERVICE
          DEVICE INTERFACE ARRIVAL     : 4d1e55b2-f16f-11cf-88cb-001111000030 [INTERFACE CLASS GUID]
            DATA                       : HID_DEVICE_UP:000D_U:0001
            DATA                       : HID_DEVICE_UP:000D_U:0002
            DATA                       : HID_DEVICE_UP:000D_U:0003
            DATA                       : HID_DEVICE_UP:000D_U:0004