Fonction ChangeServiceConfigA (winsvc.h)

Modifie les paramètres de configuration d’un service.

Pour modifier les paramètres de configuration facultatifs, utilisez la fonction ChangeServiceConfig2 .

Syntaxe

BOOL ChangeServiceConfigA(
  [in]            SC_HANDLE hService,
  [in]            DWORD     dwServiceType,
  [in]            DWORD     dwStartType,
  [in]            DWORD     dwErrorControl,
  [in, optional]  LPCSTR    lpBinaryPathName,
  [in, optional]  LPCSTR    lpLoadOrderGroup,
  [out, optional] LPDWORD   lpdwTagId,
  [in, optional]  LPCSTR    lpDependencies,
  [in, optional]  LPCSTR    lpServiceStartName,
  [in, optional]  LPCSTR    lpPassword,
  [in, optional]  LPCSTR    lpDisplayName
);

Paramètres

[in] hService

Handle du service. Ce handle est retourné par la fonction OpenService ou CreateService et doit avoir le droit d’accès SERVICE_CHANGE_CONFIG . Pour plus d’informations, consultez Sécurité des services et droits d’accès.

[in] dwServiceType

Type de service. Spécifiez SERVICE_NO_CHANGE si vous ne modifiez pas le type de service existant ; sinon, spécifiez l’un des types de service suivants.

Valeur Signification
SERVICE_FILE_SYSTEM_DRIVER
0x00000002
Service de pilote de système de fichiers.
SERVICE_KERNEL_DRIVER
0x00000001
Service de pilote.
SERVICE_WIN32_OWN_PROCESS
0x00000010
Service qui s’exécute dans son propre processus.
SERVICE_WIN32_SHARE_PROCESS
0x00000020
Service qui partage un processus avec d’autres services.
 

Si vous spécifiez SERVICE_WIN32_OWN_PROCESS ou SERVICE_WIN32_SHARE_PROCESS, et que le service s’exécute dans le contexte du compte LocalSystem, vous pouvez également spécifier le type suivant.

Valeur Signification
SERVICE_INTERACTIVE_PROCESS
0x00000100
Le service peut interagir avec le bureau.

Pour plus d’informations, consultez Services interactifs.

[in] dwStartType

Options de démarrage du service. Spécifiez SERVICE_NO_CHANGE si vous ne modifiez pas le type de démarrage existant ; sinon, spécifiez l’une des valeurs suivantes.

Valeur Signification
SERVICE_AUTO_START
0x00000002
Un service démarré automatiquement par le gestionnaire de contrôle de service au démarrage du système.
SERVICE_BOOT_START
0x00000000
Un pilote de périphérique démarré par le chargeur système. Cette valeur est uniquement valide pour les services de pilote.
SERVICE_DEMAND_START
0x00000003
Un service démarré par le gestionnaire de contrôle de service lorsqu’un processus appelle la fonction StartService .
SERVICE_DISABLED
0x00000004
Service qui ne peut pas être démarré. Les tentatives de démarrage du service entraînent le code d’erreur ERROR_SERVICE_DISABLED.
SERVICE_SYSTEM_START
0x00000001
Un pilote de périphérique démarré par la fonction IoInitSystem . Cette valeur est uniquement valide pour les services de pilote.

[in] dwErrorControl

Gravité de l’erreur et action entreprise si ce service ne parvient pas à démarrer. Spécifiez SERVICE_NO_CHANGE si vous ne modifiez pas le contrôle d’erreur existant ; sinon, spécifiez l’une des valeurs suivantes.

Valeur Signification
SERVICE_ERROR_CRITICAL
0x00000003
Si possible, le programme de démarrage consigne l’erreur dans le journal des événements. Si la dernière configuration connue est en cours de démarrage, l’opération de démarrage échoue. Dans le cas contraire, le système est redémarré avec la dernière configuration correcte connue.
SERVICE_ERROR_IGNORE
0x00000000
Le programme de démarrage ignore l’erreur et continue l’opération de démarrage.
SERVICE_ERROR_NORMAL
0x00000001
Le programme de démarrage consigne l’erreur dans le journal des événements, mais continue l’opération de démarrage.
SERVICE_ERROR_SEVERE
0x00000002
Le programme de démarrage consigne l’erreur dans le journal des événements. Si la dernière configuration connue-bonne est en cours de démarrage, l’opération de démarrage continue. Sinon, le système est redémarré avec la dernière configuration connue-bonne.

[in, optional] lpBinaryPathName

Chemin complet du fichier binaire de service. Spécifiez NULL si vous ne modifiez pas le chemin d’accès existant. Si le chemin d’accès contient un espace, il doit être cité afin qu’il soit correctement interprété. Par exemple, « d :\my share\myservice.exe » doit être spécifié en tant que « » d :\my share\myservice.exe ».

Le chemin d’accès peut également inclure des arguments pour un service de démarrage automatique. Par exemple, « d:\myshare\myservice.exe arg1 arg2 ». Ces arguments sont passés au point d’entrée du service (généralement la fonction main).

Si vous spécifiez un chemin d’accès sur un autre ordinateur, le partage doit être accessible par le compte d’ordinateur de l’ordinateur local, car il s’agit du contexte de sécurité utilisé dans l’appel distant. Toutefois, cette exigence permet à toutes les vulnérabilités potentielles de l’ordinateur distant d’affecter l’ordinateur local. Par conséquent, il est préférable d’utiliser un fichier local.

[in, optional] lpLoadOrderGroup

Nom du groupe d’ordre de chargement dont ce service est membre. Spécifiez NULL si vous ne modifiez pas le groupe existant. Spécifiez une chaîne vide si le service n’appartient pas à un groupe.

Le programme de démarrage utilise des groupes d’ordre de charge pour charger des groupes de services dans un ordre spécifié par rapport aux autres groupes. La liste des groupes d’ordre de chargement est contenue dans la valeur ServiceGroupOrder de la clé de Registre suivante :

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control

[out, optional] lpdwTagId

Pointeur vers une variable qui reçoit une valeur de balise unique dans le groupe spécifié dans le paramètre lpLoadOrderGroup . Spécifiez NULL si vous ne modifiez pas la balise existante.

Vous pouvez utiliser une balise pour commander le démarrage du service au sein d’un groupe d’ordre de charge en spécifiant un vecteur d’ordre de balise dans la valeur GroupOrderList de la clé de Registre suivante :

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control

Les balises sont évaluées uniquement pour les services de pilotes qui ont SERVICE_BOOT_START ou SERVICE_SYSTEM_START types de démarrage.

[in, optional] lpDependencies

Pointeur vers un tableau avec double fin null de noms de services séparés par null ou de groupes d’ordre de charge que le système doit démarrer avant que ce service puisse être démarré. (La dépendance à un groupe signifie que ce service peut s’exécuter si au moins un membre du groupe est en cours d’exécution après une tentative de démarrage de tous les membres du groupe.) Spécifiez NULL si vous ne modifiez pas les dépendances existantes. Spécifiez une chaîne vide si le service n’a aucune dépendance.

Vous devez préfixer les noms de groupes avec SC_GROUP_IDENTIFIER afin qu’ils puissent être distingués d’un nom de service, car les services et les groupes de services partagent le même espace de noms.

[in, optional] lpServiceStartName

Nom du compte sous lequel le service doit s’exécuter. Spécifiez NULL si vous ne modifiez pas le nom du compte existant. Si le type de service est SERVICE_WIN32_OWN_PROCESS, utilisez un nom de compte sous la forme DomainName\UserName. Le processus de service sera connecté en tant qu’utilisateur. Si le compte appartient au domaine intégré, vous pouvez spécifier .\UserName (notez que la chaîne C/C++ correspondante est .\\UserName »). Pour plus d’informations, consultez Comptes d’utilisateur de service et l’avertissement dans la section Remarques.

Un processus partagé peut s’exécuter comme n’importe quel utilisateur.

Si le type de service est SERVICE_KERNEL_DRIVER ou SERVICE_FILE_SYSTEM_DRIVER, le nom est le nom de l’objet de pilote que le système utilise pour charger le pilote de périphérique. Spécifiez NULL si le pilote doit utiliser un nom d’objet par défaut créé par le système d’E/S.

Un service peut être configuré pour utiliser un compte managé ou un compte virtuel. Si le service est configuré pour utiliser un compte de service managé, le nom est le nom du compte de service managé. Si le service est configuré pour utiliser un compte virtuel, spécifiez le nom NT SERVICE\ServiceName. Pour plus d’informations sur les comptes de service managés et les comptes virtuels, consultez le Guide pas à pas des comptes de service.

Windows Server 2008, Windows Vista, Windows Server 2003 et Windows XP : Les comptes de service managés et les comptes virtuels ne sont pas pris en charge tant que Windows 7 et Windows Server 2008 R2.

[in, optional] lpPassword

Mot de passe du nom de compte spécifié par le paramètre lpServiceStartName . Spécifiez NULL si vous ne modifiez pas le mot de passe existant. Spécifiez une chaîne vide si le compte n’a pas de mot de passe ou si le service s’exécute dans le compte LocalService, NetworkService ou LocalSystem. Pour plus d’informations, consultez Liste des enregistrements de service.

Si le nom du compte spécifié par le paramètre lpServiceStartName est le nom d’un compte de service managé ou d’un nom de compte virtuel, le paramètre lpPassword doit avoir la valeur NULL.

Les mots de passe sont ignorés pour les services de pilotes.

[in, optional] lpDisplayName

Nom d’affichage à utiliser par les applications pour identifier le service pour ses utilisateurs. Spécifiez NULL si vous ne modifiez pas le nom d’affichage existant ; sinon, cette chaîne a une longueur maximale de 256 caractères. Le nom est conservé selon la casse dans le gestionnaire de contrôle de service. Les comparaisons de noms d’affichage ne respectent toujours pas la casse.

Ce paramètre peut spécifier une chaîne localisée au format suivant :

@[path]dllname,-strID

La chaîne avec l’identificateur strID est chargée à partir de dllname ; le chemin d’accès est facultatif. Pour plus d’informations, consultez RegLoadMUIString.

Windows Server 2003 et Windows XP : Les chaînes localisées ne sont pas prises en charge avant Windows Vista.

Valeur retournée

Si la fonction réussit, la valeur de retour est différente de zéro.

Si la fonction échoue, la valeur de retour est égale à zéro. Pour obtenir des informations détaillées sur l’erreur, appelez GetLastError.

Les codes d’erreur suivants peuvent être définis par le gestionnaire de contrôle de service. D’autres codes d’erreur peuvent être définis par les fonctions de Registre appelées par le gestionnaire de contrôle de service.

Code de retour Description
ERROR_ACCESS_DENIED
Le handle n’a pas le droit d’accès SERVICE_CHANGE_CONFIG .
ERROR_CIRCULAR_DEPENDENCY
Une dépendance de service circulaire a été spécifiée.
ERROR_DUPLICATE_SERVICE_NAME
Le nom d’affichage existe déjà dans la base de données du gestionnaire de contrôleur de service, soit en tant que nom de service, soit en tant qu’autre nom d’affichage.
ERROR_INVALID_HANDLE
Le handle spécifié n’est pas valide.
ERROR_INVALID_PARAMETER
Un paramètre spécifié n’est pas valide.
ERROR_INVALID_SERVICE_ACCOUNT
Le nom du compte n’existe pas ou un service est spécifié pour partager le même fichier binaire qu’un service déjà installé, mais avec un nom de compte différent du service installé.
ERROR_SERVICE_MARKED_FOR_DELETE
Le service a été marqué pour suppression.

Remarques

La fonction ChangeServiceConfig modifie les informations de configuration du service spécifié dans la base de données du gestionnaire de contrôle de service. Vous pouvez obtenir les informations de configuration actuelles à l’aide de la fonction QueryServiceConfig .

Si la configuration est modifiée pour un service en cours d’exécution, à l’exception de lpDisplayName, les modifications ne prennent pas effet tant que le service n’est pas arrêté. Pour mettre à jour les informations d’identification sans avoir à redémarrer le service, utilisez la fonction LsaCallAuthenticationPackage .

Remarques sur la sécurité

La définition du paramètre lpServiceStartName modifie le compte d’ouverture de session du service. Cela peut entraîner des problèmes. Si vous avez inscrit un nom de principal de service (SPN), il est désormais inscrit sur le compte incorrect. De même, si vous avez utilisé un ACE pour accorder l’accès à un service, il accorderait désormais l’accès au mauvais compte.

Exemples

Pour obtenir un exemple, consultez Modification de la configuration d’un service.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows XP [applications de bureau uniquement]
Serveur minimal pris en charge Windows Server 2003 [applications de bureau uniquement]
Plateforme cible Windows
En-tête winsvc.h (inclure Windows.h)
Bibliothèque Advapi32.lib
DLL Advapi32.dll

Voir aussi

ChangeServiceConfig2

CreateService

OpenService

QueryServiceConfig

QueryServiceConfig2

QueryServiceDynamicInformation

Guide pas à pas des comptes de service (éventuellement en anglais)

Configuration de service

Fonctions de service

StartService