Componentes de servicios.4

 
Iniciando servicios automáticamente

Durante la inicialización de servicios, SCM arranca todos los que tiene en las entradas del registro con un valor 2 (SERVICE_AUTO_START) y los servicios de los que dependen. E.g. Si uno de los servicios marcados como inicio automático depende de uno marcado como manual, el servicio de inicio por demanda iniciará ese servicio manual también. El orden de carga se determina teniendo en cuenta:

  1. El orden de los grupos de servicios según la lista de orden de carga de grupos de la subclave HKLMSYSTEMCurrentControlSetControlServiceGroupOrder.
  2. El orden de controladores dentro de un grupo especificado en la subclave HKLMSYSTEMCurrentControlSetControlGroupOrderList.
  3. La lista de dependencias de cada servicio.

Cuando el proceso de inicio se completa, el sistema ejecuta el programa de comprobación de arranque especificado en la subclave HKLMSYSTEMCurrentControlSetControlBootVerificationProgram.

Predeterminadamente, este valor no está establecido. El sistema informa que el proceso de arranque se realizó con éxito después de completar la secuencia de inicios automáticos.

Después de que el equipo se ha iniciado correctamente, el sistema operativo guarda un clon de la base de datos en la Última configuración buena conocida. El sistema podrá utilizar esta copia de la base de datos si cualquier cambio hace que la base activa falle en el reinicio del equipo.

Si la entrada del registro ErrorControl de un servicio de inicio automático tiene un valor 2 (SERVICE_ERROR_SEVERE) o 3 (SERVICE_ERROR_CRITICAL) y el servicio falla en su inicio, SCM reiniciará el equipo usando la configuración de Última configuración buena conocida. Si ésta ya se ha usado, el reinicio del equipo fracasará.

Un inicio automático de un servicio sigue la secuencia:

  1. SCM inicia todos los servicios marcados con inicio automático y un valor 2 en la entrada Start. También inicia los controladores de inicio automático.
    El algoritmo para iniciar los servicios en orden correcto procede en varias fases, un sistema por el que una fase corresponde a un grupo, y las fases proceden según la secuencia definida por el orden de grupo definida y almacenada en la lista de la entrada del registro HKLMSYSTEMCurrentControlSetControlServiceGroupOrder. El valor de la entrada incluye los nombres de grupos en el orden en que SCM los iniciará.
  2. SCM marca todas las entradas de servicios que pertenecen al grupo de la fase de inicio.
  3. SCM entra en un bucle con los servicios marcados, comprobando si puede iniciar cada uno de ellos. Esa comprobación consiste en determinar si el servicio tiene una dependencia en otro grupo, especificada en la entrada DependOnGroup de la subclave del servicio.
    • Si existe alguna dependencia, el grupo del que el servicio es dependiente debe estar ya iniciado, y al menos un servicio de dicho grupo se ha iniciado correctamente.
    • Si el servicio depende de un grupo que inicia posteriormente, según la secuencia de orden de inicio, que el grupo al que pertenece él mismo, SCM registrará un error de dependencia circular del servicio.
  4. SCM comprueba si el servicio depende de uno o más servicios, y si dichos servicios ya están iniciados. Las dependencias de servicios se indican en la entrada DependOnService de la subclave del servicio.
    • Si un servicio depende de otros que pertenecen a grupos que se encuentran después en la lista de la entrada ServiceGroupOrder, SCM devuelve un error de dependencia circular y no iniciará el servicio.
    • Si el servicio depende de cualquier otro del mismo grupo que no ha sido ya iniciado, el servicio se saltará.
  5. Cuando las dependencias de un servicio se han cumplido, SCM realiza una comprobación final para ver si el servicio es parte de la configuración de arranque actual antes de iniciarlo.
  6. Cuando SCM inicia un servicio, primero determina el nombre del archivo que ejecuta el proceso del servicio leyendo su valor en la entrada ImagePath en la subclave del registro del servicio.
  7. Entonces examina el valor de la entrada Type, y si ésta es 32 (es decir, que el servicio comparte proceso), SCM se asegura que el proceso que ejecuta el servicio -si ya está iniciado- ha iniciado sesión mediante la misma cuenta que tiene especificada para ser iniciado. Una entrada del registro ObjectName del servicio almacena la cuenta de usuario con la que se ejecuta el servicio. SCM fallará en el inicio del servicio si no hay cuenta determinada y devolverá un error ERROR_INVALID_SERVICE_ACCOUNT.
  8. SCM comprueba que el proceso del servicio no ha sido ya iniciado con una cuenta distinta comprobando si el valor de la entrada ImagePath tiene una entrada en la base de datos de SCM identificada como image database.
    • Si esta imagen no tiene un registro para la entrada ImagePath, SCM crea una. Cuando se crea un nuevo registro, se almacena la cuenta de inicio de sesión utilizada para el servicio y los datos del valor de la entrada ImagePath. SCM necesita que los servicios tengan una entrada de ImagePath.
    • Si el servicio no tiene una entrada ImagePath, SCM devuelve un error de estado que no puede encontrar el path del servicio y es incapaz de iniciarlo.
    • Si SCM localiza una entrada en una image database existente un dato coincidente con el valor de la entrada ImagePath, se asegura que la información de cuenta de usuario del servicio es la misma que está almacenada en el registro de la BD. Un proceso puede iniciar sesión con una única cuenta, devolviendo un ERROR_DIFFERENT_SERVICE_ACCOUNT si el servicio especifica una cuenta distinta que otro servicio ya iniciado dentro del mismo proceso ha usado.
  9. SCM inicia sesión de un servicio si la configuración del servicio especifica que el proceso del servicio debe iniciarse. SCM inicia sesión de los servicios que no se ejecutan con la cuenta del sistema (system) mediante llamada a la API LogonUserEx, implementada por Lsass.exe (Local Security Authority). Lsass.exe normalmente necesita una contraseña, pero SCM le indica que la contraseña está almacenada mediante LSA en la subclave HKLMSECURITYPolicySecrets.

    Los contenidos de la clave HKLMSECURITY no suelen estar visibles porque su configuración predeterminada sólo permite el acceso desde la cuenta System.

  10. Cuando SCM llama a LogonUserEx, especifica un inicio de sesión de servicio como tipo de inicio de sesión. Lsass.exe busca la contraseña en la clave mencionada y SCM le redirige para almacenar la contraseña como un secreto cuando un programa de control de servicio configura información de inicio de sesión de un servicio usando las API CreateService o ChangeServiceConfig.
  11. Cuando un inicio de sesión es correcto, LogonUserEx devuelve un handler para un token de acceso para el llamante. Windows Server 2003 usa tokens de acceso para representar su contexto de seguridad, y luego SCM asocia el token con el proceso que implementa el servicio.
  12. Después del inicio de sesión correcta, SCM carga la información del perfil de la cuenta, si no está ya cargada, llamando a LoadUserProfile, que está implementada en Userenv.dll en ruta_sistemasystem32. La entrada del registro ProfileImagePath de la rama HKLMSOFTWAREMicrosoftWindows NTCurrentVersionProfileList<<clave_perfil_usuario>> contiene la ubicación en disco de un conjunto de registro que carga en el registro, estando la información del conjunto en la rama HKEY_CURRENT_USER, para el servicio.
  13. SCM procede a iniciar el proceso del servicio, si el proceso no ha sido ya iniciado. SCM lo hace en un estado de suspensión y crea un conducto mediante el que se comunica con el proceso, y le asigna el conducto al nombre PipeNetNetControlPipeX, donde X es un número que se incrementa cada vez que SCM crea un conducto.
  14. SCM reanuda el proceso del servicio y espera que el servicio conecte con su conducto SCM.
    • Si el conducto existe, el valor de la entrada del registro ServicesPipeTimeout en la rama HKLMSYSTEMCurrentControlSetControl determina la duración que SCM espera a que el servicio conecte antes de abandonar y terminar el proceso.
    • Si la entrada ServicesPipeTimeout no existe, SCM usa 30 segundos como el tiempo predeterminado. Tiempo que usará SCM en todas las comunicaciones del servicio.
      Cuando un servicio conecta con SCM mediante un conducto, SCM envia un comando de inicio al servicio. Si el servicio falla en la respuesta positiva al comando de inicio dentro del tiempo de retardo, SCM abandona y se mueve hacia el inicio del siguiente servicio.
      Cuando un servicio no responde a una solicitud de inicio, SCM detendrá el proceso si éste no contiene otros servicion en ejecución. Procederá a la detención sin un servicio OWN_PROCESS falla o si el primero de los servicios SHARED_PROCESS a iniciar falla. En este último caso, SCM devolverá un ERROR_SERVICE_REQUEST_TIMEOUT (en solicitudes de inicio por demanda) y registrará un EVENT_CONNECTION_TIMEOUT.
      Un servicio inicio por demanda colgado -por ejemplo, un servicio clavado en un SERVICE_START_PENDING siempre- no será detenido por SCM, pero generará un mensaje de evento de error (EVENT_SERVICE_START_HUNG) y posiblemente un mensaje en una ventana emergente.
  15. Así, de esta manera, SCM continua un bucle mediante los servicios pertenecientes a un grupo hasta que todos ellos han sido iniciados o han devuelto errores. El bucle es la forma en que SCM ordena automáticamente los servicios dentro de un grupo de acuerdo con el valor de sus entradas DependOnService. El bucle ayuda a SCM enviar parámetros de inicio a un servicio dependiente mientras los argumentos se mantienen en la pila hasta que el servicio dependiente es iniciado. SCM iniciará los servicios de los que otros dependen en anteriores bucles, saltando los servicios dependientes hasta bucles subsiguientes.

    SCM ignora entradas de etiqueta para controladores de dispositivos en subclaves bajo la rama HKLMSYSTEMCurrentControlSetServices. El administrador de E/S satisface las entradas para ordenar el inicio de los controladores de dispositivo en el arranque e inicio de controladores de inicio-de-sistema.

  16. Después que SCM completa las comprobaciones para todos los grupos en la lista de la entrada List en HKLMSYSTEMCurrentControlSetControlServiceGroupOrder, lleva a cabo la comprobación de los servicios que quedan (los no agrupados).
  17. Cuando las dependencias de un servicio han sido cumplidas, SCM hace una comprobación final para determinar si el servicio es parte de la última configuración buena conocida antes de iniciarlo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *