Partilhar via


Eventos de gatilho de serviço

Um serviço pode se registrar para ser iniciado ou interrompido quando ocorre um evento de gatilho. Isso elimina a necessidade de os serviços serem iniciados quando o sistema é iniciado, ou de os serviços pesquisarem ou aguardarem ativamente por um evento; Um serviço pode ser iniciado quando é necessário, em vez de iniciar automaticamente independentemente de haver ou não trabalho a fazer. Exemplos de eventos de gatilho predefinidos incluem a chegada de um dispositivo de uma classe de interface de dispositivo especificada ou a disponibilidade de uma porta de firewall específica. Um serviço também pode se registrar para um evento de gatilho personalizado gerado por um provedor de Rastreamento de Eventos para Windows (ETW).

Windows Server 2008, Windows Vista, Windows Server 2003 e Windows XP: os eventos de gatilho do Serviço não são suportados até o Windows Server 2008 R2 e o Windows 7.

Um gatilho consiste em um tipo de evento de gatilho, um subtipo de evento de gatilho, a ação a ser tomada em resposta ao evento de gatilho e (para certos tipos de evento de gatilho) um ou mais itens de dados específicos do gatilho. O subtipo e os itens de dados específicos do gatilho juntos especificam as condições para notificar o serviço do evento. O formato de um item de dados depende do tipo de evento de gatilho; Um item de dados pode ser dados binários, uma cadeia de caracteres ou uma cadeia de caracteres múltipla. As cadeias de caracteres devem ser Unicode; Não há suporte para cadeias de caracteres ANSI.

Para se registrar para eventos de gatilho, o serviço chama ChangeServiceConfig2 com SERVICE_CONFIG_TRIGGER_INFO e fornece uma estrutura SERVICE_TRIGGER_INFO. A estrutura SERVICE_TRIGGER_INFO aponta para uma matriz de estruturas SERVICE_TRIGGER, cada uma especificando um gatilho.

A ação de gatilho especificada é executada se a condição de gatilho for verdadeira quando o sistema for iniciado ou se a condição de gatilho se tornar verdadeira enquanto o sistema estiver em execução. Por exemplo, se um serviço se registra para ser iniciado quando um determinado dispositivo está disponível, o serviço é iniciado quando o sistema é iniciado se o dispositivo já estiver conectado ao computador; O serviço é iniciado quando o dispositivo chega se o usuário conecta o dispositivo enquanto o sistema está em execução.

Se um gatilho tiver itens de dados específicos do gatilho, a ação de gatilho será executada somente se o item de dados que acompanha o evento de gatilho corresponder a um dos itens de dados que o serviço especificou com o gatilho. A correspondência de dados binários é feita por comparação bitwise. A correspondência de cadeias de caracteres não diferencia maiúsculas de minúsculas. Se o item de dados for uma multistring, todas as strings na multistring deverão corresponder.

Quando um serviço é iniciado em resposta a um evento de gatilho, o serviço recebe SERVICE_TRIGGER_STARTED_ARGUMENT como argv[1] em seu ServiceMain função de retorno de chamada. Argv[0] é sempre o nome curto do serviço.

Um serviço que se registra para ser iniciado em resposta a um evento de gatilho pode parar após um tempo limite ocioso quando o serviço não tem trabalho a fazer. Um serviço que para a si mesmo deve estar preparado para lidar com solicitações de controle SERVICE_CONTROL_TRIGGEREVENT que chegam enquanto o serviço está parando. O SCM envia uma solicitação de controle de SERVICE_CONTROL_TRIGGEREVENT sempre que um novo evento de gatilho ocorre enquanto o serviço está no estado de execução. Para evitar a perda de eventos de gatilho, o serviço deve retornar ERROR_SHUTDOWN_IN_PROGRESS para qualquer solicitação de controle de SERVICE_CONTROL_TRIGGEREVENT que chegue enquanto o serviço está em transição da execução para a parada. Isso instrui o SCM a enfileirar eventos de gatilho e aguardar que o serviço entre no estado interrompido. Em seguida, o SCM executa a ação associada ao evento de gatilho enfileirado, como iniciar o serviço.

Quando o serviço estiver pronto para manipular eventos de gatilho novamente, ele define SERVICE_ACCEPT_TRIGGEREVENT em sua máscara aceita por controles em uma chamada para SetServiceStatus. Isso geralmente é feito quando o serviço chama SetServiceStatus com SERVICE_RUNNING. Em seguida, o SCM emite uma solicitação de SERVICE_CONTROL_TRIGGEREVENT para cada evento de gatilho enfileirado até que a fila esteja vazia.

Um serviço que tenha serviços dependentes em execução não pode ser interrompido em resposta a um evento de gatilho.

As solicitações trigger-start e trigger-stop não são garantidas em condições de pouca memória.

Use a funçãoQueryServiceConfig2 para recuperar a configuração de evento de gatilho de um serviço.

A ferramenta SC (sc.exe) pode ser usada para configurar ou consultar os eventos de gatilho de um serviço no prompt de comando. Use a opção triggerinfo para configurar um serviço para iniciar ou parar em resposta a um evento de gatilho. Use a opção qtriggerinfo para consultar a configuração de gatilho de um serviço.

O exemplo a seguir consulta a configuração de gatilho do serviço W32time, que é configurado para iniciar quando o computador ingressa em um domínio e parar quando o computador sai do domínio.

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]

O exemplo a seguir consulta a configuração de gatilho do serviço de entrada do tablet, que é configurado para iniciar quando um dispositivo HID com o GUID {4d1e55b2-f16f-11cf-88cb-001111000030} e qualquer um dos IDs de dispositivo HID especificados chega.

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