Función ChangeServiceConfigA (winsvc.h)

Cambia los parámetros de configuración de un servicio.

Para cambiar los parámetros de configuración opcionales, use la función ChangeServiceConfig2 .

Sintaxis

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
);

Parámetros

[in] hService

Identificador del servicio. La función OpenService o CreateService devuelve este identificador y debe tener el derecho de acceso SERVICE_CHANGE_CONFIG . Para obtener más información, consulte Derechos de acceso y seguridad de servicio.

[in] dwServiceType

Tipo de servicio. Especifique SERVICE_NO_CHANGE si no cambia el tipo de servicio existente; De lo contrario, especifique uno de los siguientes tipos de servicio.

Valor Significado
SERVICE_FILE_SYSTEM_DRIVER
0x00000002
Servicio de controlador del sistema de archivos.
SERVICE_KERNEL_DRIVER
0x00000001
Servicio de controlador.
SERVICE_WIN32_OWN_PROCESS
0x00000010
Servicio que se ejecuta en su propio proceso.
SERVICE_WIN32_SHARE_PROCESS
0x00000020
Servicio que comparte un proceso con otros servicios.
 

Si especifica SERVICE_WIN32_OWN_PROCESS o SERVICE_WIN32_SHARE_PROCESS, y el servicio se ejecuta en el contexto de la cuenta LocalSystem, también puede especificar el tipo siguiente.

Valor Significado
SERVICE_INTERACTIVE_PROCESS
0x00000100
El servicio puede interactuar con el escritorio.

Para obtener más información, consulte Interactive Services.

[in] dwStartType

Las opciones de inicio del servicio. Especifique SERVICE_NO_CHANGE si no cambia el tipo de inicio existente; de lo contrario, especifique uno de los valores siguientes.

Valor Significado
SERVICE_AUTO_START
0x00000002
Un servicio iniciado automáticamente por el administrador de control de servicios durante el inicio del sistema.
SERVICE_BOOT_START
0x00000000
Un controlador de dispositivo iniciado por el cargador del sistema. Este valor solamente es válido para servicios de controladores.
SERVICE_DEMAND_START
0x00000003
Un servicio iniciado por el administrador de control de servicios cuando un proceso llama a la función StartService .
SERVICE_DISABLED
0x00000004
Un servicio que no se puede iniciar. Los intentos de iniciar el servicio dan como resultado el código de error ERROR_SERVICE_DISABLED.
SERVICE_SYSTEM_START
0x00000001
Un controlador de dispositivo iniciado por la función IoInitSystem . Este valor solamente es válido para servicios de controladores.

[in] dwErrorControl

Gravedad del error y acción realizada, si este servicio no se inicia. Especifique SERVICE_NO_CHANGE si no cambia el control de error existente; de lo contrario, especifique uno de los valores siguientes.

Valor Significado
SERVICE_ERROR_CRITICAL
0x00000003
El programa de inicio registra el error en el registro de eventos, si es posible. Si se está iniciando la última configuración correcta conocida, se produce un error en la operación de inicio. De lo contrario, el sistema se reinicia con la última configuración correcta conocida.
SERVICE_ERROR_IGNORE
0x00000000
El programa de inicio omite el error y continúa la operación de inicio.
SERVICE_ERROR_NORMAL
0x00000001
El programa de inicio registra el error en el registro de eventos, pero continúa la operación de inicio.
SERVICE_ERROR_SEVERE
0x00000002
El programa de inicio registra el error en el registro de eventos. Si se está iniciando la última configuración correcta conocida, la operación de inicio continúa. De lo contrario, el sistema se reinicia con la última configuración correcta conocida.

[in, optional] lpBinaryPathName

Ruta de acceso completa al archivo binario del servicio. Especifique NULL si no va a cambiar la ruta de acceso existente. Si la ruta de acceso contiene un espacio, se debe citar para que se interprete correctamente. Por ejemplo, "d:\my share\myservice.exe" debe especificarse como ""d:\my share\myservice.exe"".

La ruta de acceso también puede incluir argumentos para un servicio de inicio automático. Por ejemplo, "d:\myshare\myservice.exe arg1 arg2". Estos argumentos se pasan al punto de entrada de servicio (normalmente la función principal ).

Si especifica una ruta de acceso en otro equipo, el recurso compartido debe ser accesible para la cuenta de equipo del equipo local porque se trata del contexto de seguridad que se usa en la llamada remota. Sin embargo, este requisito permite que las posibles vulnerabilidades del equipo remoto afecten al equipo local. Por lo tanto, es mejor usar un archivo local.

[in, optional] lpLoadOrderGroup

Nombre del grupo de pedidos de carga del que este servicio es miembro. Especifique NULL si no va a cambiar el grupo existente. Especifique una cadena vacía si el servicio no pertenece a un grupo.

El programa de inicio usa grupos de ordenación de carga para cargar grupos de servicios en un orden especificado con respecto a los demás grupos. La lista de grupos de ordenación de carga se incluye en el valor ServiceGroupOrder de la siguiente clave del Registro:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control

[out, optional] lpdwTagId

Puntero a una variable que recibe un valor de etiqueta que es único en el grupo especificado en el parámetro lpLoadOrderGroup . Especifique NULL si no va a cambiar la etiqueta existente.

Puede usar una etiqueta para ordenar el inicio del servicio dentro de un grupo de pedidos de carga especificando un vector de orden de etiqueta en el valor GroupOrderList de la siguiente clave del Registro:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control

Las etiquetas solo se evalúan para los servicios de controladores que tienen SERVICE_BOOT_START o SERVICE_SYSTEM_START tipos de inicio.

[in, optional] lpDependencies

Puntero a una matriz doble terminada en null de nombres separados por null de servicios o grupos de ordenación de carga que el sistema debe iniciar antes de que se pueda iniciar este servicio. (La dependencia de un grupo significa que este servicio se puede ejecutar si al menos un miembro del grupo se está ejecutando después de un intento de iniciar todos los miembros del grupo). Especifique NULL si no va a cambiar las dependencias existentes. Especifique una cadena vacía si el servicio no tiene dependencias.

Debe prefijar los nombres de grupo con SC_GROUP_IDENTIFIER para que se puedan distinguir de un nombre de servicio, ya que los servicios y los grupos de servicios comparten el mismo espacio de nombres.

[in, optional] lpServiceStartName

Nombre de la cuenta en la que se debe ejecutar el servicio. Especifique NULL si no cambia el nombre de la cuenta existente. Si el tipo de servicio es SERVICE_WIN32_OWN_PROCESS, use un nombre de cuenta con el formato DomainName\UserName. El proceso de servicio se iniciará como usuario. Si la cuenta pertenece al dominio integrado, puede especificar .\UserName (tenga en cuenta que la cadena de C/C++ correspondiente es ".\\UserName"). Para obtener más información, vea Cuentas de usuario de servicio y la advertencia en la sección Comentarios.

Un proceso compartido se puede ejecutar como cualquier usuario.

Si el tipo de servicio es SERVICE_KERNEL_DRIVER o SERVICE_FILE_SYSTEM_DRIVER, el nombre es el nombre del objeto de controlador que el sistema usa para cargar el controlador de dispositivo. Especifique NULL si el controlador va a usar un nombre de objeto predeterminado creado por el sistema de E/S.

Un servicio se puede configurar para usar una cuenta administrada o una cuenta virtual. Si el servicio está configurado para usar una cuenta de servicio administrada, el nombre es el nombre de la cuenta de servicio administrada. Si el servicio está configurado para usar una cuenta virtual, especifique el nombre como NT SERVICE\ServiceName. Para obtener más información sobre las cuentas de servicio administradas y las cuentas virtuales, consulte la Guía paso a paso de cuentas de servicio.

Windows Server 2008, Windows Vista, Windows Server 2003 y Windows XP: Las cuentas de servicio administradas y las cuentas virtuales no se admiten hasta Windows 7 y Windows Server 2008 R2.

[in, optional] lpPassword

Contraseña del nombre de la cuenta especificado por el parámetro lpServiceStartName . Especifique NULL si no cambia la contraseña existente. Especifique una cadena vacía si la cuenta no tiene contraseña o si el servicio se ejecuta en la cuenta LocalService, NetworkService o LocalSystem. Para obtener más información, vea Service Record List.

Si el nombre de cuenta especificado por el parámetro lpServiceStartName es el nombre de una cuenta de servicio administrada o un nombre de cuenta virtual, el parámetro lpPassword debe ser NULL.

Las contraseñas se omiten para los servicios de controladores.

[in, optional] lpDisplayName

Nombre para mostrar que usarán las aplicaciones para identificar el servicio para sus usuarios. Especifique NULL si no cambia el nombre para mostrar existente; de lo contrario, esta cadena tiene una longitud máxima de 256 caracteres. El nombre se conserva entre mayúsculas y minúsculas en el administrador de control de servicios. Las comparaciones de nombres para mostrar siempre no distinguen mayúsculas de minúsculas.

Este parámetro puede especificar una cadena localizada con el formato siguiente:

@[path]dllname,-strID

La cadena con identificador strID se carga desde dllname; la ruta de acceso es opcional. Para obtener más información, vea RegLoadMUIString.

Windows Server 2003 y Windows XP: Las cadenas localizadas no se admiten hasta Windows Vista.

Valor devuelto

Si la función se realiza correctamente, el valor devuelto es distinto de cero.

Si la función no se realiza correctamente, el valor devuelto es cero. Para obtener información de error extendida, llame a GetLastError.

El administrador de control de servicios puede establecer los siguientes códigos de error. Otros códigos de error pueden establecerse mediante las funciones del Registro a las que llama el administrador de control de servicios.

Código devuelto Descripción
ERROR_ACCESS_DENIED
El identificador no tiene el derecho de acceso SERVICE_CHANGE_CONFIG .
ERROR_CIRCULAR_DEPENDENCY
Se especificó una dependencia de servicio circular.
ERROR_DUPLICATE_SERVICE_NAME
El nombre para mostrar ya existe en la base de datos de Service Controller Manager, ya sea como nombre de servicio o como otro nombre para mostrar.
ERROR_INVALID_HANDLE
El identificador especificado no es válido.
ERROR_INVALID_PARAMETER
Un parámetro especificado no es válido.
ERROR_INVALID_SERVICE_ACCOUNT
El nombre de la cuenta no existe o se especifica un servicio para compartir el mismo archivo binario que un servicio ya instalado, pero con un nombre de cuenta que no es el mismo que el servicio instalado.
ERROR_SERVICE_MARKED_FOR_DELETE
El servicio se ha marcado para su eliminación.

Comentarios

La función ChangeServiceConfig cambia la información de configuración del servicio especificado en la base de datos del administrador de control de servicios. Puede obtener la información de configuración actual mediante la función QueryServiceConfig .

Si se cambia la configuración de un servicio que se está ejecutando, con la excepción de lpDisplayName, los cambios no surten efecto hasta que se detenga el servicio. Para actualizar las credenciales sin tener que reiniciar el servicio, use la función LsaCallAuthenticationPackage .

Comentarios de seguridad

Al establecer el parámetro lpServiceStartName , se cambia la cuenta de inicio de sesión del servicio. Esto puede causar problemas. Si ha registrado un nombre de entidad de seguridad de servicio (SPN), ahora se registraría en la cuenta incorrecta. Del mismo modo, si ha usado una ACE para conceder acceso a un servicio, ahora concedería acceso a la cuenta incorrecta.

Ejemplos

Para obtener un ejemplo, consulte Cambio de la configuración de un servicio.

Requisitos

Requisito Value
Cliente mínimo compatible Windows XP [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2003 [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado winsvc.h (incluye Windows.h)
Library Advapi32.lib
Archivo DLL Advapi32.dll

Consulte también

ChangeServiceConfig2

CreateService

OpenService

QueryServiceConfig

QueryServiceConfig2

QueryServiceDynamicInformation

Guía paso a paso de las cuentas de servicio

Configuración de servicio

Funciones de servicio

StartService