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.
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 |
---|---|
|
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 |
---|---|
|
Un service démarré automatiquement par le gestionnaire de contrôle de service au démarrage du système. |
|
Un pilote de périphérique démarré par le chargeur système. Cette valeur est uniquement valide pour les services de pilote. |
|
Un service démarré par le gestionnaire de contrôle de service lorsqu’un processus appelle la fonction StartService . |
|
Service qui ne peut pas être démarré. Les tentatives de démarrage du service entraînent le code d’erreur ERROR_SERVICE_DISABLED. |
|
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.
[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 |
---|---|
|
Le handle n’a pas le droit d’accès SERVICE_CHANGE_CONFIG . |
|
Une dépendance de service circulaire a été spécifiée. |
|
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. |
|
Le handle spécifié n’est pas valide. |
|
Un paramètre spécifié n’est pas valide. |
|
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é. |
|
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
QueryServiceDynamicInformation
Guide pas à pas des comptes de service (éventuellement en anglais)