changeServiceConfigA 函数 (winsvc.h)

更改服务的配置参数。

若要更改可选配置参数,请使用 ChangeServiceConfig2 函数。

语法

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

参数

[in] hService

服务的句柄。 此句柄由 OpenServiceCreateService 函数返回,必须具有 SERVICE_CHANGE_CONFIG 访问权限。 有关详细信息,请参阅 服务安全和访问权限

[in] dwServiceType

服务的类型。 如果不更改现有服务类型,请指定 SERVICE_NO_CHANGE ;否则,请指定以下服务类型之一。

含义
SERVICE_FILE_SYSTEM_DRIVER
0x00000002
文件系统驱动程序服务。
SERVICE_KERNEL_DRIVER
0x00000001
驱动程序服务。
SERVICE_WIN32_OWN_PROCESS
0x00000010
在其自己的进程中运行的服务。
SERVICE_WIN32_SHARE_PROCESS
0x00000020
与其他服务共享进程的服务。
 

如果指定 SERVICE_WIN32_OWN_PROCESSSERVICE_WIN32_SHARE_PROCESS,并且服务在 LocalSystem 帐户的上下文中运行,则还可以指定以下类型。

含义
SERVICE_INTERACTIVE_PROCESS
0x00000100
该服务可以与桌面交互。

有关详细信息,请参阅 交互式服务

[in] dwStartType

服务启动选项。 如果不更改现有开始类型,请指定 SERVICE_NO_CHANGE ;否则,请指定以下值之一。

含义
SERVICE_AUTO_START
0x00000002
服务控制管理器在系统启动期间自动启动的服务。
SERVICE_BOOT_START
0x00000000
由系统加载程序启动的设备驱动程序。 此值只对驱动程序服务有效。
SERVICE_DEMAND_START
0x00000003
当进程调用 StartService 函数时由服务控制管理器启动的服务。
SERVICE_DISABLED
0x00000004
无法启动的服务。 尝试启动服务会导致错误代码 ERROR_SERVICE_DISABLED
SERVICE_SYSTEM_START
0x00000001
IoInitSystem 函数启动的设备驱动程序。 此值只对驱动程序服务有效。

[in] dwErrorControl

错误的严重性,以及此服务无法启动时采取的操作。 如果不更改现有错误控制,请指定 SERVICE_NO_CHANGE ;否则,请指定以下值之一。

含义
SERVICE_ERROR_CRITICAL
0x00000003
启动程序在事件日志中记录错误(如果可能)。 如果最近一次的正确配置正在启动,则启动操作会失败。 否则,系统会使用上次已知的良好配置重启系统。
SERVICE_ERROR_IGNORE
0x00000000
启动程序将忽略错误并继续启动操作。
SERVICE_ERROR_NORMAL
0x00000001
启动程序在事件日志中记录错误,但继续启动操作。
SERVICE_ERROR_SEVERE
0x00000002
启动程序将错误记录在事件日志中。 如果启动最后一个已知良好的配置,则启动操作将继续。 否则,系统会使用上次已知良好的配置重启系统。

[in, optional] lpBinaryPathName

服务二进制文件的完全限定路径。 如果不更改现有路径,请指定 NULL。 如果路径包含空格,则必须用引号将其括起来,以便正确解释它。 例如,应将“d:\my share\myservice.exe”指定为“d:\my share\myservice.exe”。

路径还可以包含自动启动服务的参数。 例如,“d:\myshare\myservice.exe arg1 arg2”。 这些参数通常传递到服务入口点 (main函数) 。

如果在另一台计算机上指定路径,则本地计算机的计算机帐户必须可访问共享,因为这是远程调用中使用的安全上下文。 但是,此要求允许远程计算机中的任何潜在漏洞影响本地计算机。 因此,最好使用本地文件。

[in, optional] lpLoadOrderGroup

此服务所属的负载排序组的名称。 如果不更改现有组,请指定 NULL。 如果服务不属于组,请指定一个空字符串。

启动程序使用负载排序组以相对于其他组的指定顺序加载服务组。 负载排序组的列表包含在以下注册表项的 ServiceGroupOrder 值中:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control

[out, optional] lpdwTagId

指向变量的指针,该变量接收在 lpLoadOrderGroup 参数中指定的组中唯一的标记值。 如果不更改现有标记,请指定 NULL。

通过在以下注册表项的 GroupOrderList 值中指定标记顺序向量,可以使用标记在负载排序组中对服务启动进行排序:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control

仅针对具有 SERVICE_BOOT_STARTSERVICE_SYSTEM_START 启动类型的驱动程序服务评估标记。

[in, optional] lpDependencies

指向以 null 结尾的双精度数组的指针,这些数组以 null 分隔的服务名称或加载排序组,系统必须先启动此服务,然后才能启动此服务。 (对组的依赖关系意味着,如果在尝试启动组的所有成员后至少有一个组成员正在运行,则此服务可以运行。) 如果不更改现有依赖项,请指定 NULL。 如果服务没有依赖项,请指定一个空字符串。

必须为组名称添加SC_GROUP_IDENTIFIER前缀,以便可以将其与服务名称区分开来,因为服务和服务组共享相同的名称空间。

[in, optional] lpServiceStartName

运行服务的帐户的名称。 如果不更改现有帐户名称,请指定 NULL 。 如果服务类型为SERVICE_WIN32_OWN_PROCESS,请使用“域\名称用户名”格式的帐户。 服务进程将以此用户身份登录。 如果帐户属于内置域,则可以指定 .\UserName (请注意,相应的 C/C++ 字符串为“.\\UserName”) 。 有关详细信息,请参阅 “服务用户帐户 ”和“备注”部分中的警告。

共享进程可以以任何用户身份运行。

如果服务类型 SERVICE_KERNEL_DRIVERSERVICE_FILE_SYSTEM_DRIVER,则名称是系统用于加载设备驱动程序的驱动程序对象名称。 如果驱动程序要使用 I/O 系统创建的默认对象名称,请指定 NULL

可以将服务配置为使用托管帐户或虚拟帐户。 如果服务配置为使用托管服务帐户,则名称为托管服务帐户名称。 如果服务配置为使用虚拟帐户,请将名称指定为 NT SERVICE\ServiceName。 有关托管服务帐户和虚拟帐户的详细信息,请参阅 服务帐户分步指南

Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP: 在 Windows 7 和 Windows Server 2008 R2 之前,不支持托管服务帐户和虚拟帐户。

[in, optional] lpPassword

lpServiceStartName 参数指定的帐户名的密码。 如果不更改现有密码,请指定 NULL 。 如果帐户没有密码,或者服务在 LocalService、NetworkService 或 LocalSystem 帐户中运行,请指定一个空字符串。 有关详细信息,请参阅 服务记录列表

如果 lpServiceStartName 参数指定的帐户名称是托管服务帐户的名称或虚拟帐户名称,则 lpPassword 参数必须为 NULL

对于驱动程序服务,将忽略密码。

[in, optional] lpDisplayName

应用程序用于为其用户标识服务的显示名称。 如果不更改现有显示名称,请指定 NULL ;否则,此字符串的最大长度为 256 个字符。 名称在服务控制管理器中保留大小写。 显示名称比较始终不区分大小写。

此参数可使用以下格式指定本地化字符串:

@[path]dllname,-strID

具有标识符 strID 的字符串从 dllname 加载; 路径 是可选的。 有关详细信息,请参阅 RegLoadMUIString

Windows Server 2003 和 Windows XP: 在 Windows Vista 之前,不支持本地化字符串。

返回值

如果该函数成功,则返回值为非零值。

如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。

以下错误代码可能由服务控制管理器设置。 其他错误代码可能由服务控制管理器调用的注册表函数设置。

返回代码 说明
ERROR_ACCESS_DENIED
句柄没有 SERVICE_CHANGE_CONFIG 访问权限。
ERROR_CIRCULAR_DEPENDENCY
指定了循环服务依赖项。
ERROR_DUPLICATE_SERVICE_NAME
显示名称已存在于服务控制器管理器数据库中,作为服务名称或另一个显示名称。
ERROR_INVALID_HANDLE
指定的句柄无效。
ERROR_INVALID_PARAMETER
指定的参数无效。
ERROR_INVALID_SERVICE_ACCOUNT
帐户名称不存在,或者指定服务与已安装的服务共享相同的二进制文件,但帐户名称与已安装的服务不同。
ERROR_SERVICE_MARKED_FOR_DELETE
服务已标记为要删除。

注解

ChangeServiceConfig 函数更改服务控制管理器数据库中指定服务的配置信息。 可以使用 QueryServiceConfig 函数获取当前配置信息。

如果更改了正在运行的服务的配置( lpDisplayName 除外),则在服务停止之前,更改不会生效。 若要在不重启服务的情况下更新凭据,请使用 LsaCallAuthenticationPackage 函数。

安全备注

设置 lpServiceStartName 参数会更改服务的登录帐户。 这可能会导致问题。 如果已将服务主体名称注册 (SPN) ,则现在会在错误的帐户上注册该名称。 同样,如果已使用 ACE 授予对服务的访问权限,它现在会授予对错误帐户的访问权限。

示例

有关示例,请参阅 更改服务的配置

要求

要求
最低受支持的客户端 Windows XP [仅限桌面应用]
最低受支持的服务器 Windows Server 2003 [仅限桌面应用]
目标平台 Windows
标头 winsvc.h (包括 Windows.h)
Library Advapi32.lib
DLL Advapi32.dll

另请参阅

ChangeServiceConfig2

CreateService

OpenService

QueryServiceConfig

QueryServiceConfig2

QueryServiceDynamicInformation

服务帐户分步指南

服务配置

服务函数

StartService