changeServiceConfigW 函数 (winsvc.h)
更改服务的配置参数。
若要更改可选配置参数,请使用 ChangeServiceConfig2 函数。
语法
BOOL ChangeServiceConfigW(
[in] SC_HANDLE hService,
[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,
[in, optional] LPCWSTR lpDisplayName
);
参数
[in] hService
服务的句柄。 此句柄由 OpenService 或 CreateService 函数返回,必须具有 SERVICE_CHANGE_CONFIG 访问权限。 有关详细信息,请参阅 服务安全和访问权限。
[in] dwServiceType
服务的类型。 如果不更改现有服务类型,请指定 SERVICE_NO_CHANGE ;否则,请指定以下服务类型之一。
如果指定 SERVICE_WIN32_OWN_PROCESS 或 SERVICE_WIN32_SHARE_PROCESS,并且服务在 LocalSystem 帐户的上下文中运行,则还可以指定以下类型。
值 | 含义 |
---|---|
|
该服务可以与桌面交互。
有关详细信息,请参阅 交互式服务。 |
[in] dwStartType
服务启动选项。 如果不更改现有开始类型,请指定 SERVICE_NO_CHANGE ;否则,请指定以下值之一。
值 | 含义 |
---|---|
|
服务控制管理器在系统启动期间自动启动的服务。 |
|
由系统加载程序启动的设备驱动程序。 此值只对驱动程序服务有效。 |
|
当进程调用 StartService 函数时由服务控制管理器启动的服务。 |
|
无法启动的服务。 尝试启动服务会导致错误代码 ERROR_SERVICE_DISABLED。 |
|
由 IoInitSystem 函数启动的设备驱动程序。 此值只对驱动程序服务有效。 |
[in] dwErrorControl
错误的严重性,以及此服务无法启动时采取的操作。 如果不更改现有错误控制,请指定 SERVICE_NO_CHANGE ;否则,请指定以下值之一。
[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_START 或 SERVICE_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_DRIVER 或 SERVICE_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。
以下错误代码可能由服务控制管理器设置。 其他错误代码可能由服务控制管理器调用的注册表函数设置。
返回代码 | 说明 |
---|---|
|
句柄没有 SERVICE_CHANGE_CONFIG 访问权限。 |
|
指定了循环服务依赖项。 |
|
显示名称已存在于服务控制器管理器数据库中,作为服务名称或另一个显示名称。 |
|
指定的句柄无效。 |
|
指定的参数无效。 |
|
帐户名称不存在,或者指定服务与已安装的服务共享相同的二进制文件,但帐户名称与已安装的服务不同。 |
|
服务已标记为要删除。 |
注解
ChangeServiceConfig 函数更改服务控制管理器数据库中指定服务的配置信息。 可以使用 QueryServiceConfig 函数获取当前配置信息。
如果更改了正在运行的服务的配置( lpDisplayName 除外),则在服务停止之前,更改不会生效。 若要在不重启服务的情况下更新凭据,请使用 LsaCallAuthenticationPackage 函数。
安全备注
设置 lpServiceStartName 参数会更改服务的登录帐户。 这可能会导致问题。 如果已将服务主体名称注册 (SPN) ,则现在会在错误的帐户上注册该名称。 同样,如果已使用 ACE 授予对服务的访问权限,它现在会授予对错误帐户的访问权限。示例
有关示例,请参阅 更改服务的配置。
要求
最低受支持的客户端 | Windows XP [仅限桌面应用] |
最低受支持的服务器 | Windows Server 2003 [仅限桌面应用] |
目标平台 | Windows |
标头 | winsvc.h (包括 Windows.h) |
Library | Advapi32.lib |
DLL | Advapi32.dll |