Compartir a través de


Función CreateServiceW (winsvc.h)

Crea un objeto de servicio y lo agrega a la base de datos de Service Control Manager especificada.

Sintaxis

SC_HANDLE CreateServiceW(
  [in]            SC_HANDLE hSCManager,
  [in]            LPCWSTR   lpServiceName,
  [in, optional]  LPCWSTR   lpDisplayName,
  [in]            DWORD     dwDesiredAccess,
  [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
);

Parámetros

[in] hSCManager

Identificador de la base de datos del administrador de control de servicios. La función OpenSCManager devuelve este identificador y debe tener el derecho de acceso SC_MANAGER_CREATE_SERVICE . Para obtener más información, consulte Derechos de acceso y seguridad de servicio.

[in] lpServiceName

Nombre del servicio que se va a instalar. La longitud máxima de la cadena es de 256 caracteres. La base de datos del Administrador de control de servicios conserva las mayúsculas y minúsculas de los caracteres, pero las comparaciones de nombres de servicio siempre no distinguen mayúsculas de minúsculas. La barra diagonal (/) y la barra diagonal inversa (\) no son caracteres de nombre de servicio válidos.

[in, optional] lpDisplayName

Nombre para mostrar que van a usar los programas de interfaz de usuario para identificar el servicio. 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.

[in] dwDesiredAccess

Acceso al servicio. Antes de conceder el acceso solicitado, el sistema comprueba el token de acceso del proceso de llamada. Para obtener una lista de valores, consulte Derechos de acceso y seguridad de servicio.

[in] dwServiceType

El tipo de servicio. Este parámetro puede ser uno de los valores siguientes.

Valor Significado
SERVICE_ADAPTER
0x00000004
Reservado.
SERVICE_FILE_SYSTEM_DRIVER
0x00000002
Servicio de controlador del sistema de archivos.
SERVICE_KERNEL_DRIVER
0x00000001
Servicio de controlador.
SERVICE_RECOGNIZER_DRIVER
0x00000008
Reservado.
SERVICE_WIN32_OWN_PROCESS
0x00000010
Servicio que se ejecuta en su propio proceso.
SERVICE_WIN32_SHARE_PROCESS
0x00000020
Servicio que comparte un proceso con uno o varios otros servicios. Para obtener más información, vea Programas de servicio.
 

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 siguiente valor.

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. Este parámetro puede ser 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. Para obtener más información, consulte Inicio automático de servicios.
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 . Para obtener más información, consulte Starting Services on Demand.
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. Este parámetro puede ser 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. 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 por la cuenta de equipo del equipo local porque este es el 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

Nombres del grupo de pedidos de carga del que es miembro este servicio. Especifique NULL o 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 encuentra en el siguiente valor del Registro: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\ServiceGroupOrder

[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 cambia 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 siguiente valor del Registro:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\GroupOrderList

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

[in, optional] lpDependencies

Puntero a una matriz terminada en null doble de nombres separados por null de servicios o grupos de ordenación de carga que el sistema debe iniciar antes de este servicio. Especifique NULL o una cadena vacía si el servicio no tiene dependencias. 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.

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. 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.

Si este parámetro es NULL, CreateService usa la cuenta LocalSystem. Si el tipo de servicio especifica SERVICE_INTERACTIVE_PROCESS, el servicio debe ejecutarse en la cuenta LocalSystem.

Si este parámetro es NT AUTHORITY\LocalService, CreateService usa la cuenta LocalService. Si el parámetro es NT AUTHORITY\NetworkService, CreateService usa la cuenta NetworkService.

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 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.

Valor devuelto

Si la función se ejecuta correctamente, el valor devuelto es un identificador para el servicio.

Si la función no se realiza correctamente, el valor devuelto es NULL. 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 se pueden establecer mediante las funciones del Registro a las que llama el administrador de control de servicio.

Código devuelto Descripción
ERROR_ACCESS_DENIED
El identificador de la base de datos SCM no tiene el derecho de acceso SC_MANAGER_CREATE_SERVICE .
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 del Administrador de control de servicios como un nombre de servicio o como otro nombre para mostrar.
ERROR_INVALID_HANDLE
El identificador de la base de datos del Administrador de control de servicios especificado no es válido.
ERROR_INVALID_NAME
El nombre de servicio 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 de usuario especificado en el parámetro lpServiceStartName no existe.
ERROR_SERVICE_EXISTS
El servicio especificado ya existe en esta base de datos.
ERROR_SERVICE_MARKED_FOR_DELETE
El servicio especificado ya existe en esta base de datos y se ha marcado para su eliminación.

Comentarios

La función CreateService crea un objeto de servicio e lo instala en la base de datos del Administrador de control de servicios mediante la creación de una clave con el mismo nombre que el servicio en la siguiente clave del Registro:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services

La información especificada por CreateService, ChangeServiceConfig y ChangeServiceConfig2 se guarda como valores en esta clave. A continuación se muestran ejemplos de valores almacenados para un servicio.

Valor Descripción
DependOnGroup Grupos de ordenación de carga en los que depende este servicio, según lo especificado por lpDependencies.
DependOnService Servicios de los que depende este servicio, según lo especificado por lpDependencies.
Descripción Descripción especificada por ChangeServiceConfig2.
DisplayName Nombre para mostrar especificado por lpDisplayName.
ErrorControl Control de error especificado por dwErrorControl.
FailureActions Acciones de error especificadas por ChangeServiceConfig2.
Grupo Grupo de ordenación de carga especificado por lpLoadOrderGroup. Tenga en cuenta que establecer este valor puede invalidar la configuración del valor DependOnService .
Imagepath Nombre del archivo binario, como se especifica en lpBinaryPathName.
ObjectName Nombre de cuenta especificado por lpServiceStartName.
Iniciar Cuándo iniciar el servicio, como se especifica en dwStartType.
Tag Identificador de etiqueta especificado por lpdwTagId.
Tipo Tipo de servicio especificado por dwServiceType.
 

Los programas de instalación y el propio servicio pueden crear subclaves adicionales para información específica del servicio.

El identificador devuelto solo es válido para el proceso que llamó a CreateService. Se puede cerrar llamando a la función CloseServiceHandle .

Si va a crear servicios que comparten un proceso, evite llamar a funciones con efectos de todo el proceso, como ExitProcess. Además, no descargue el archivo DLL del servicio.

Ejemplos

Para obtener un ejemplo, consulte Instalació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

ChangeServiceConfig

ChangeServiceConfig2

CloseServiceHandle

ControlService

DeleteService

EnumDependentServices

OpenSCManager

QueryServiceConfig

QueryServiceDynamicInformation

QueryServiceObjectSecurity

QueryServiceStatusEx

Guía paso a paso de las cuentas de servicio

Funciones de servicio

Instalación, eliminación y enumeración del servicio

SetServiceObjectSecurity

StartService