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 |
---|---|
|
Reservado. |
|
Servicio de controlador del sistema de archivos. |
|
Servicio de controlador. |
|
Reservado. |
|
Servicio que se ejecuta en su propio proceso. |
|
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 |
---|---|
|
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 |
---|---|
|
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. |
|
Un controlador de dispositivo iniciado por el cargador del sistema. Este valor solamente es válido para servicios de controladores. |
|
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. |
|
Un servicio que no se puede iniciar. Los intentos de iniciar el servicio dan como resultado el código de error ERROR_SERVICE_DISABLED. |
|
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.
[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 |
---|---|
|
El identificador de la base de datos SCM no tiene el derecho de acceso SC_MANAGER_CREATE_SERVICE . |
|
Se especificó una dependencia de servicio circular. |
|
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. |
|
El identificador de la base de datos del Administrador de control de servicios especificado no es válido. |
|
El nombre de servicio especificado no es válido. |
|
Un parámetro especificado no es válido. |
|
El nombre de la cuenta de usuario especificado en el parámetro lpServiceStartName no existe. |
|
El servicio especificado ya existe en esta base de datos. |
|
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
QueryServiceDynamicInformation
Guía paso a paso de las cuentas de servicio