| Développé par | Microsoft |
|---|---|
| Fichier exécutable |
services.exe |
| Environnement | Windows |
| Type | contrÎleur de démons |
| Politique de distribution | incorporé dans Windows |
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.
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
[modifier | modifier le code]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é
[modifier | modifier le code]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. Ă 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
[modifier | modifier le code]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
[modifier | modifier le code]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.

