Partager via


ChangeServiceConfigW, fonction (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 ChangeServiceConfigW(
  [in]            SC_HANDLE hService,
  [in]            DWORD     dwServiceType,
  [in]            DWORD     dwStartType,
  [in]            DWORD     dwErrorControl,
  [in, optional]  LPCWSTR   lpBinaryPathName,
  [in, optional]  LPCWSTR   lpLoadOrderGroup,
  [out, optional] LPDWORD   lpdwTagId,
  [in, optional]  LPCWSTR   lpDependencies,
  [in, optional]  LPCWSTR   lpServiceStartName,
  [in, optional]  LPCWSTR   lpPassword,
  [in, optional]  LPCWSTR   lpDisplayName
);

Paramètres

[in] hService

Handle pour le 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é du service 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
Service démarré automatiquement par le gestionnaire de contrôle de service lors du 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
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 enregistre 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. Sinon, le système est redémarré avec la dernière bonne configuration connue.
SERVICE_ERROR_IGNORE
0x00000000
Le programme de démarrage ignore l’erreur et poursuit l’opération de démarrage.
SERVICE_ERROR_NORMAL
0x00000001
Le programme de démarrage enregistre 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 enregistre 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 se poursuit. Sinon, le système est redémarré avec la dernière configuration connue.

[in, optional] lpBinaryPathName

Chemin d’accès complet au fichier binaire de service. Spécifiez NULL si vous ne modifiez pas le chemin d’accès existant. Si le chemin contient un espace, il doit être entre guillemets pour qu’il soit correctement interprété. Par exemple, « d:\my share\myservice.exe » doit être spécifié comme « "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 de 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 charge 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 classer le démarrage du service au sein d’un groupe d’ordre de chargement 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 pilote qui ont des types de démarrage SERVICE_BOOT_START ou SERVICE_SYSTEM_START .

[in, optional] lpDependencies

Pointeur vers un tableau à double terminaison 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 vis-à-vis d’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

   
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