ChangeServiceConfig功能可更改服务的配置参数。
BOOL ChangeServiceConfig(
SC_HANDLE 【hService】, | //处理服务 |
DWORD 【dwServiceType】, | //服务类型 |
DWORD 【dwStartType】, | //何时开始服务 |
DWORD 【dwErrorControl】, | //服务无法启动时的严重性 |
LPCTSTR 【lpBinaryPathName】, | //指向服务二进制文件名的指针 |
LPCTSTR 【lpLoadOrderGroup】, | //指向加载排序组名称的指针 |
LPDWORD 【lpdwTagId】, | //指向变量的指针来获取标签标识符 |
LPCTSTR 【lpDependencies】, | //指向依赖项名称数组的指针 |
LPCTSTR 【lpServiceStartName】, | //指向服务的帐户名称 |
LPCTSTR 【//指向密码字符串的指针】, | //指向服务帐户密码的指针 |
LPCTSTR 【lpDisplayName】 | //指向显示名称的指针 |
); |
参数
【hService】
标识服务。该句柄由OpenService或CreateService函数返回,必须具有SERVICE_CHANGE_CONFIG访问权限。
【dwServiceType】
一组指定服务类型的位标志。如果不更改现有的服务类型,请指定SERVICE_NO_CHANGE;否则,指定以下服务类型标志之一来指示服务类型。另外,如果指定了SERVICE_WIN32标志,还可以指定SERVICE_INTERACTIVE_PROCESS标志,以使服务进程与桌面进行交互。
值 | 含义 |
SERVICE_WIN32_OWN_PROCESS | 一种服务类型标志,指定在其自身进程中运行的Win32服务。 |
SERVICE_WIN32_SHARE_PROCESS | 指定与其他服务共享进程的Win32服务的服务类型标志。 |
SERVICE_KERNEL_DRIVER | 指定Windows NT设备驱动程序的服务类型标志。 |
SERVICE_FILE_SYSTEM_DRIVER | 指定Windows NT文件系统驱动程序的服务类型标志。 |
SERVICE_INTERACTIVE_PROCESS | 一个使Win32服务进程与桌面交互的标志。 |
【dwStartType】
指定何时启动服务。如果现有的开始类型未被修改,则该值可以是服务类型SERVICE_NO_CHANGE,或者可以指定以下值之一:
值 | 含义 |
SERVICE_BOOT_START | 指定由操作系统加载程序启动的设备驱动程序。仅当服务类型为SERVICE_KERNEL_DRIVER或SERVICE_FILE_SYSTEM_DRIVER时,此值才有效。 |
SERVICE_SYSTEM_START | 指定由IoInitSystem功能启动的设备驱动程序。仅当服务类型为SERVICE_KERNEL_DRIVER或SERVICE_FILE_SYSTEM_DRIVER时,此值才有效。 |
SERVICE_AUTO_START | 在系统启动期间自动指定由服务控制管理员启动的设备驱动程序或Win32服务。 |
SERVICE_DEMAND_START | 当进程调用StartService函数时,指定由服务控制管理器启动的设备驱动程序或Win32服务。 |
SERVICE_DISABLED | 指定无法再启动的设备驱动程序或Win32服务。 |
【dwErrorControl】
如果此服务在启动过程中无法启动,则指定错误的严重性,并确定启动程序在发生故障时所采取的操作。可以指定以下值之一:
值 | 含义 |
SERVICE_ERROR_IGNORE | 启动(引导)程序记录错误,但继续启动操作。 |
SERVICE_ERROR_NORMAL | 启动程序记录错误,并弹出一个消息框,但继续启动操作。 |
SERVICE_ERROR_SEVERE | 启动程序记录错误。如果最后一个已知的配置正在启动,启动操作将继续。否则,系统将使用最后一次已知的配置重新启动。 |
SERVICE_ERROR_CRITICAL | 如果可能,启动程序记录错误。如果最后一个已知的配置正在启动,则启动操作失败。否则,系统将以最后一次已知的良好配置重新启动。 |
SERVICE_NO_CHANGE | 现有的StartType值不被更改。 |
【lpBinaryPathName】
指向包含服务二进制文件的完全限定路径的以null结尾的字符串。如果指针为NULL,则不修改路径。
【lpLoadOrderGroup】
指向以null结尾的字符串,指定此服务是其成员的负载排序组。如果指针为NULL,则该组不会被修改。如果它指向一个空字符串,则该服务不属于一个组。
注册表有一个位于的负载排序组列表
HKEY_LOCAL_MACHINES\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以外的帐户。
如果服务类型为SERVICE_KERNEL_DRIVER或SERVICE_FILE_SYSTEM_DRIVER,则此名称是Windows NT驱动程序对象名称(即\\ FileSystem \\ Rdr或\\ Driver \\ Xns),输入和输出(I / O)系统用于加载设备驱动程序。如果指定了NULL,则驱动程序将使用由I / O系统创建的默认对象名称,基于服务名称运行。
【//指向密码字符串的指针】
如果服务类型为SERVICE_WIN32_OWN_PROCESS或SERVICE_WIN32_SHARE_PROCESS,则指向包含由【lpServiceStartName】参数指定的帐户名称的密码的空终止字符串。如果指针为NULL,则不修改密码。如果它指向一个空字符串,则该服务没有密码。如果服务类型为SERVICE_KERNEL_DRIVER或SERVICE_FILE_SYSTEM_DRIVER,则此参数将被忽略。
【lpDisplayName】
指向由用户界面程序用于标识该服务的空终止字符串。该字符串的最大长度为256个字符。该名称在案例中保留在服务控制管理器中。显示名称比较始终不区分大小写。
返回值
如果函数成功,返回值不为零。
如果函数失败,返回值为零。要获取扩展错误信息,请调用GetLastError.
错误
服务控制管理器可以设置以下错误代码。其他错误代码可以由服务控制管理器调用的注册表函数设置。
值 | 含义 | ||||||||||||||||||||||
ERROR_ACCESS_DENIED | |||||||||||||||||||||||
指定的句柄未使用SERVICE_CHANGE_CONFIG访问权限打开。 | |||||||||||||||||||||||
ERROR_CIRCULAR_DEPENDENCY | |||||||||||||||||||||||
指定了循环服务依赖关系。 | |||||||||||||||||||||||
ERROR_DUP_NAME | |||||||||||||||||||||||
显示名称已经存在于服务控制器的数据库中,作为服务名称或另一个显示名称。 | |||||||||||||||||||||||
ERROR_INVALID_HANDLE | |||||||||||||||||||||||
指定的句柄无效。 | |||||||||||||||||||||||
ERROR_INVALID_PARAMETER | |||||||||||||||||||||||
指定的参数无效。 | |||||||||||||||||||||||
ERROR_INVALID_SERVICE_ACCOUNT | |||||||||||||||||||||||
帐户名称不存在,或者指定服务共享与已安装服务相同的二进制文件,但是具有与已安装服务不同的帐户名称。 | |||||||||||||||||||||||
ERROR_SERVICE_MARKED_FOR_DELETE | |||||||||||||||||||||||
该服务已被标记为删除。 |
备注
ChangeServiceConfig功能更改服务控制管理器数据库中指定服务的配置信息。此配置信息最初由CreateService功能指定,可以使用QueryServiceConfig功能查询(密码参数除外)。
为此函数指定的任何配置参数可以通过为字符串参数指定NULL或为双字参数指定SERVICE_NO_CHANGE而保持不变。
如果正在运行的服务的配置已更改(【lpDisplayName】除外),更改将在服务停止之前生效。
也可以看看
CreateService, OpenService, QueryServiceConfig, StartService