Service Control Manager
Le composant Service Control Manager (abr. SCM) de Windows est un serveur RPC qui gère non seulement le démarrage et l'arrêt des services Windows, mais aussi la création et la suppression de ces services.
Développé par | Microsoft |
---|---|
Fichier exécutable |
services.exe |
Environnement | Windows |
Type | contrôleur de démons |
Politique de distribution | incorporé dans Windows |
Il est démarré au boot du système d'exploitation (o.s) et est basé sur les RPC afin que les services concernés puissent être sur un autre ordinateur[1]
Les différentes actions effectuées par services.exe sont
- Maintenir la base de données des services installés
- DĂ©marrer les services ou les pilotes lors du boot ou Ă la demande
- Énumérer les services installés et les services liés à un pilote
- Maintenir les informations sur les statuts de chaque service : démarré, en cours de démarrage, ou arrêté
- Transmettre les requêtes de contrôle aux services en cours d'exécution
- Verrouiller et déverrouiller la base de données des services
services.exe maintient une base de données des services installés dans la base de registre dans HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services (exemple de champ : startService). La base de données est utilisée par services.exe et par les programmes qui ajoutent, modifient ou configurent des services. Elle contient notamment des informations sur les dépendances entre services.
Quand un service est démarré, services.exe effectue les étapes suivantes :
- Retrouver les informations sur le login utilisé par le service
- Journaliser l'information dans un fichier
- Charger le profil du login
- Créer le service dans un état suspendu
- Attribuer un jeton Winlogon au processus
- Permettre au processus de s'exécuter
L'exécution de services.exe est gérée par le processus wininit.exe[2]
Mise en Ĺ“uvre
L'exécutable SCM, Services.exe , s'exécute en tant que programme de console Windows et est lancé par le processus Wininit au tout début du démarrage du système . Sa fonction principale, SvcCtrlMain() , lance tous les services configurés pour un démarrage automatique. Tout d'abord, une base de données interne des services installés est initialisée en lisant les deux clés de registre suivantes :
- HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder\List , contenant les noms et l'ordre des groupes de services. La clé de registre de chaque service contient une valeur de Group facultative qui régit l'ordre d'initialisation d'un service ou d'un pilote de périphérique respectif , en ce qui concerne les autres groupes de services.
- HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services , qui contient la base de données actuelle des services et des pilotes de périphérique et est lu dans la base de données interne de SCM. [3] SCM lit la valeur de Group chaque service ainsi que les dépendances d'ordre de chargement à partir de leurs clés de registre DependOnGroup et DependOnService .
À l'étape suivante, la fonction principale de SCM, SvcCtrlMain() appelle la fonction ScGetBootAndSystemDriverState() qui vérifie si les pilotes de périphérique devant être démarrés lors du démarrage ou le démarrage du système ont été chargés, et ceux qui ont échoué sont stockés dans une liste appelée ScFailedDrivers . Ensuite, un canal nommé \Pipe\Ntsvcs est créé en tant \Pipe\Ntsvcs appel de procédure distante entre le SCM et les SCP (processus de contrôle de service) qui interagissent avec des services spécifiques.
Ensuite, il appelle la fonction ScAutoStartServices() , qui parcourt tous les services marqués comme démarrage automatique, en prêtant attention aux dépendances calculées de l’ordre de chargement. En cas de dépendance circulaire, une erreur est notée et le service dépendant d'un service appartenant à un groupe venant plus tard dans l'ordre de chargement est ignoré. Pour les services de démarrage automatique retardé, le regroupement n'a aucun effet et ceux-ci sont chargés à une étape ultérieure du démarrage du système.
Pour chaque service qu'il veut démarrer, le SCM appelle la fonction ScStartService() qui vérifie le nom du fichier qui exécute le processus du service, en s'assurant que le compte spécifié pour le service est identique au compte dans lequel le processus de service s'exécute. service qui ne s'exécute pas dans le compte System est connecté en appelant la fonction LogonUserEx() , pour laquelle le processus LSASS recherche les mots de passe "secrets" stockés dans la clé de registre HKLM\SECURITY\Policy\Secrets\ , qui ont été stockés par le SCP utilisant l'API LsaStorePrivateData() lors de la configuration initiale du service.
Ensuite, la fonction ScLogonAndStartImage() est appelée pour chaque service dont le processus de service n'a pas encore été lancé. Les processus de service sont créés dans un état suspendu via l'API CreateProcessAsUser() . Avant la reprise de l'exécution du processus de service, un tuyau nommé \Pipe\Net\NtControlPipeX (où X est un nombre incrémenté pour chaque itération de service) est créé et sert de canal de communication entre le GDS et le processus de service. Le processus de service se connecte au canal en appelant la fonction StartServiceCtrlDispatcher() , après quoi le SCM envoie au service une commande "start".
Services de démarrage automatique retardé
Des services de démarrage automatique différé ont été ajoutés à Windows Vista afin de résoudre le problème du démarrage prolongé du système et d’accélérer le démarrage de services critiques qui ne peuvent pas être retardés. [8] À l’origine, la méthode d’initialisation du service à démarrage automatique était conçue pour les services système essentiels dont dépendent d’autres applications et services. Le SCM initialise les services différés uniquement après avoir traité tous les services de démarrage automatique non différé, en ScInitDelayStart() fonction ScInitDelayStart() . Cette fonction met en file d'attente un élément de travail retardé (120 secondes par défaut) associé à un thread de travail correspondant. Hormis le fait d'être initialisé après un délai, il n'y a pas d'autres différences entre les services retardés et non retardés.
Pilotes de périphérique
Les services dont la valeur de registre Type est SERVICE_KERNEL_DRIVER ou SERVICE_FILE_SYSTEM_DRIVER sont traités spécifiquement : ils représentent les pilotes de périphérique pour lesquels ScStartService()
appelle la fonction ScLoadDeviceDriver()
qui charge le pilote approprié (généralement un fichier avec une extension .sys
) %SystemRoot%\System32\Drivers\
. À cette fin, l'appel système NtLoadDriver est appelé et le SeLoadDriverPrivilege
est ajouté au processus du SCM.
Lettres de lecteur réseau
Le SCM fournit une fonctionnalité supplémentaire qui n’a aucun rapport avec les services Windows : il avertit les applications à interface graphique telles que l’explorateur Windows de la création ou de la suppression d’une connexion par lettre de lecteur réseau, en diffusant les messages Windows WM_DEVICECHANGE.