CreateService函数创建一个服务对象,并将其添加到指定的服务控制管理器数据库。
SC_HANDLE CreateService(
SC_HANDLE hSCManager, | //处理服务控制管理器数据库 |
LPCTSTR lpServiceName, | //指向要启动的服务的名称 |
LPCTSTR lpDisplayName, | //指向显示名称的指针 |
DWORD dwDesiredAccess, | //访问服务类型 |
DWORD dwServiceType, | //服务类型 |
DWORD dwStartType, | //何时开始服务 |
DWORD dwErrorControl, | //服务无法启动时的严重性 |
LPCTSTR lpBinaryPathName, | //指向二进制文件的名称 |
LPCTSTR lpLoadOrderGroup, | //指向加载排序组的名称 |
LPDWORD lpdwTagId, | //指向变量的指针来获取标签标识符 |
LPCTSTR lpDependencies, | //指向依赖项名称数组的指针 |
LPCTSTR lpServiceStartName, | //指向服务的帐户名称 |
LPCTSTR // pointer to password string | //指向服务帐户密码的指针 |
); |
参数
hSCManager
标识服务控制管理器数据库。必须使用具有SC_MANAGER_CREATE_SERVICE访问权限的OpenSCManager打开该句柄。
lpServiceName
指向以空字符结尾的字符串,命名要安装的服务。最大字符串长度为256个字符。服务控制管理器数据库保留字符的大小写,但服务名称比较始终不区分大小写。前斜杠(/)和反斜杠(\\)是无效的服务名称字符。
lpDisplayName
指向要由用户界面程序用于标识服务的以空字符结尾的字符串。该字符串的最大长度为256个字符。该名称在案例中保留在服务控制管理器中。显示名称比较始终不区分大小写。
dwDesiredAccess
指定对服务的访问。在授予所请求的访问权限之前,系统检查调用进程的访问令牌。可以指定以下任何或全部服务对象访问类型:
访问 | 描述 |
SERVICE_ALL_ACCESS | 除了表中列出的所有访问类型之外,还包括STANDARD_RIGHTS_REQUIRED。 |
SERVICE_CHANGE_CONFIG | 启用ChangeServiceConfig功能来更改服务配置。 |
SERVICE_ENUMERATE_DEPENDENTS | 启用EnumDependentServices函数来枚举依赖于该服务的所有服务。 |
SERVICE_INTERROGATE | 启用ControlService功能来请求服务立即报告其状态。 |
SERVICE_PAUSE_CONTINUE | 启用ControlService功能的暂停或继续服务。 |
SERVICE_QUERY_CONFIG | 启用QueryServiceConfig功能查询服务配置。 |
SERVICE_QUERY_STATUS | 允许调用QueryServiceStatus功能来向服务控制管理员询问服务的状态。 |
SERVICE_START | 启用StartService功能启动服务。 |
SERVICE_STOP | 启用ControlService功能来停止服务。 |
SERVICE_USER_DEFINED_CONTROL | 允许调用ControlService函数来指定用户定义的控制代码。 |
STANDARD_RIGHTS_REQUIRED常量(在WINNT.H文件中定义)启用以下服务对象访问类型:
标准权利 | 描述 |
DELETE | 启用DeleteService功能来删除该服务。 |
READ_CONTROL | 启用QueryServiceObjectSecurity函数查询服务对象的安全描述符。 |
WRITE_DAC|WRITE_OWNER | 启用SetServiceObjectSecurity功能来修改服务对象的安全描述符。 |
dwDesiredAccess参数可以指定以下通用访问类型中的任何一种或全部:
通用访问 | 服务访问 |
GENERIC_READ | 组合以下访问:STANDARD_RIGHTS_READ,SERVICE_QUERY_CONFIG,SERVICE_QUERY_STATUS和SERVICE_ENUMERATE_DEPENDENTS。 |
GENERIC_WRITE | 组合以下访问:STANDARD_RIGHTS_WRITE和SERVICE_CHANGE_CONFIG。 |
GENERIC_EXECUTE | 组合以下访问:STANDARD_RIGHTS_EXECUTE,SERVICE_START,SERVICE_STOP,SERVICE_PAUSE_CONTINUE,SERVICE_INTERROGATE和SERVICE_USER_DEFINED_CONTROL。 |
dwServiceType
一组指定服务类型的位标志。您必须指定以下服务类型标志之一来指示服务类型。另外,如果指定了SERVICE_WIN32标志,还可以指定SERVICE_INTERACTIVE_PROCESS标志,以使服务进程与桌面进行交互。
值 | 含义 |
SERVICE_WIN32_OWN_PROCESS | 一个service-type标志,用于指定在其自身进程中运行的Win32服务。 |
SERVICE_WIN32_SHARE_PROCESS | 指定与其他服务共享进程的Win32服务的服务类型标志。 |
SERVICE_KERNEL_DRIVER | 指定Windows NT设备驱动程序的服务类型标志。 |
SERVICE_FILE_SYSTEM_DRIVER | 指定Windows NT文件系统驱动程序的服务类型标志。 |
SERVICE_INTERACTIVE_PROCESS | 一个使Win32服务进程与桌面交互的标志。 |
dwStartType
指定何时启动服务。该成员可以是以下值之一:
值 | 含义 |
SERVICE_BOOT_START | 指定由操作系统加载程序启动的设备驱动程序。仅当服务类型为SERVICE_KERNEL_DRIVER或SERVICE_FILE_SYSTEM_DRIVER时,此值才有效。 |
SERVICE_SYSTEM_START | 指定在引导设备(如引导文件系统和磁盘驱动程序)已初始化后由I / O系统启动的设备驱动程序。启动该标志的设备驱动程序对于系统引导并不重要。仅当服务类型为SERVICE_KERNEL_DRIVER或SERVICE_FILE_SYSTEM_DRIVER时,此值才有效。 |
SERVICE_AUTO_START | 在系统启动期间自动指定由服务控制管理员启动的设备驱动程序或服务。 |
SERVICE_DEMAND_START | 指定当进程调用StartService函数时由服务控制管理器启动的设备驱动程序或服务。 |
SERVICE_DISABLED | 指定无法再启动的设备驱动程序或Win32服务。 |
dwErrorControl
如果此服务在启动过程中无法启动,则指定错误的严重性,并确定启动程序在发生故障时所采取的操作。可以指定以下值之一:
值 | 含义 |
SERVICE_ERROR_IGNORE | 启动(引导)程序记录错误,但继续启动操作。 |
SERVICE_ERROR_NORMAL | 启动程序记录错误并显示消息,但继续启动操作。 |
SERVICE_ERROR_SEVERE | 启动程序记录错误。如果最后一个已知的配置正在启动,启动操作将继续。否则,系统将使用最后一次已知的配置重新启动。 |
SERVICE_ERROR_CRITICAL | 如果可能,启动程序记录错误。如果最后一个已知的配置正在启动,则启动操作失败。否则,系统将使用最后一次已知的配置重新启动。 |
lpBinaryPathName
指向包含服务二进制文件的完全限定路径的以null结尾的字符串。
lpLoadOrderGroup
指向一个以null结尾的字符串,命名此服务是其成员的负载排序组。如果指针为NULL或指向空字符串,则该服务不属于组。注册表中列出了以下负载排序组:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control
\ServiceGroupOrder.
启动程序使用此列表按照列表中其他组的指定顺序加载服务组。您可以将服务放在组中,以便其他服务可以依赖组。
服务启动的顺序由以下标准决定:
1.在注册表的加载排序组列表中的组的顺序。首先启动加载排序组列表中的组中的服务,其次是不在加载排序组列表中的组中的服务,然后是不属于组的服务。
2.在lpDependencies参数中列出的服务依赖关系以及依赖服务的其他服务的依赖关系。
lpdwTagId
指向在lpLoadOrderGroup参数中指定的组中为此服务接收唯一标记值的32位变量。如果没有请求标签,此参数可以为NULL。
您可以通过在注册表中指定标签订单向量来使用标签来在装入订购组中订购服务启动:
HKEY_LOCAL_MACHINE \\ System \\ CurrentControlSet
\Control\GroupOrderList.
标签仅针对具有SERVICE_BOOT_START或SERVICE_SYSTEM_START起始类型的SERVICE_KERNEL_DRIVER和SERVICE_FILE_SYSTEM_DRIVER类型服务进行评估。
lpDependencies
指向必须在此服务之前开始的一系列以零分隔的服务名称或加载排序组。该数组是双null终止的。如果指针为NULL或指向空字符串,则该服务不具有依赖关系。如果指定了组名称,则必须以SC_GROUP_IDENTIFIER字符(在WINSVC.H文件中定义)为前缀,以将其与服务名称区分开来,因为服务和服务组共享相同的名称空间。对服务的依赖性意味着该服务只有在所依赖的服务正在运行时才能运行。对组的依赖意味着如果在尝试启动组的所有成员后至少有一个成员正在运行,则此服务可以运行。
lpServiceStartName
指向一个以null结尾的字符串。如果服务类型为SERVICE_WIN32_OWN_PROCESS,则此名称是“DomainName \\ Username”形式的帐户名称,服务进程将在运行时登录。如果帐户属于内置域,可以指定“。\\用户名”。SERVICE_WIN32_SHARE_PROCESS类型的服务不允许指定LocalSystem以外的帐户。如果指定为NULL,则该服务将以“LocalSystem”帐户身份登录,在这种情况下,// pointer to password string参数必须为NULL。
如果服务类型为SERVICE_KERNEL_DRIVER或SERVICE_FILE_SYSTEM_DRIVER,则此名称是Windows NT驱动程序对象名称(即\\ FileSystem \\ Rdr或\\ Driver \\ Xns),输入和输出(I / O)系统用于加载设备驱动程序。如果指定了NULL,则驱动程序将使用由I / O系统创建的默认对象名称,基于服务名称运行。
// pointer to password string
如果服务类型为SERVICE_WIN32_OWN_PROCESS或SERVICE_WIN32_SHARE_PROCESS,则指向包含由lpServiceStartName参数指定的帐户名称的密码的空终止字符串。如果指针为NULL或指向空字符串,则该服务不具有密码。如果服务类型为SERVICE_KERNEL_DRIVER或SERVICE_FILE_SYSTEM_DRIVER,则此参数将被忽略。
返回值
如果函数成功,则返回值是该服务的句柄。
如果函数失败,返回值为NULL。要获取扩展错误信息,请调用GetLastError.
错误
服务控制管理器可以设置以下错误代码。其他错误代码可以由服务控制管理器调用的注册表函数设置。
值 | 含义 |
ERROR_ACCESS_DENIED | 指定的服务控制管理器数据库的句柄不具有SC_MANAGER_CREATE_SERVICE访问权限。 |
ERROR_CIRCULAR_DEPENDENCY | 指定了循环服务依赖关系。 |
ERROR_DUP_NAME | 显示名称已经作为服务名称或另一个显示名称存在于服务控制管理器数据库中。 |
ERROR_INVALID_HANDLE | 指定的服务控制管理器数据库的句柄无效。 |
ERROR_INVALID_NAME | 指定的服务名称无效。 |
ERROR_INVALID_PARAMETER | 指定的参数无效。 |
ERROR_INVALID_SERVICE_ACCOUNT | lpServiceStartName参数中指定的用户帐户名称不存在。 |
ERROR_SERVICE_EXISTS | 指定的服务已经存在于此数据库中。 |
备注
CreateService函数创建一个服务对象,并将其安装在服务控制管理器数据库中,方法是使用以下形式在注册表中创建服务名称键:
HKEY_LOCAL_MACHINE\System\CurrentControlSet
\\ SERVICES \\
其中lpServiceName是为此函数指定的服务名称。为此函数指定的信息保存为此键下的值。安装程序和服务本身可以在此服务名称键下创建任何特定于服务的信息的子项。
如果启用了适当的访问权限,则调用进程可以使用返回的句柄在以下函数中标识新创建的服务:
ChangeServiceConfig, ControlService, DeleteService, QueryServiceConfig, QueryServiceObjectSecurity, QueryServiceStatus, SetServiceObjectSecurity, StartService
返回的句柄仅对称为CreateService的进程有效。可以通过调用CloseServiceHandle函数关闭它。
也可以看看
ChangeServiceConfig, CloseServiceHandle, ControlService, DeleteService, EnumDependentServices, OpenSCManager, QueryServiceConfig, QueryServiceObjectSecurity, QueryServiceStatus, SetServiceObjectSecurity, StartService