Win32_Service 类的更改方法 (Mbnapi.h)

ChangeWMI 类方法修改Win32_Service

本主题使用托管对象格式 (MOF) 语法。 有关使用此方法的详细信息,请参阅 调用方法

语法

uint32 Change(
  [in] string  DisplayName,
  [in] string  PathName,
  [in] uint32  ServiceType,
  [in] uint32  ErrorControl,
  [in] string  StartMode,
  [in] boolean DesktopInteract,
  [in] string  StartName,
  [in] string  StartPassword,
  [in] string  LoadOrderGroup,
  [in] string  LoadOrderGroupDependencies[],
  [in] string  ServiceDependencies[]
);

参数

DisplayName [in]

服务的显示名称。 此字符串的最大长度为 256 个字符。 名称在服务控制管理器中保留大小写。 DisplayName 比较始终不区分大小写。

约束:接受与 Name 属性相同的值。

示例“Atdisk”。

PathName [in]

实现服务的可执行文件的完全限定路径,例如“\SystemRoot\System32\drivers\afd.sys”。

ServiceType [in]

提供给调用它们的进程的服务类型。

1 (0x1)

内核驱动程序

2 (0x2)

文件系统驱动程序

4 (0x4)

适配器

8 (0x8)

识别器驱动程序

16 (0x10)

自己的进程

32 (0x20)

共享进程

256 (0x100)

交互式进程

ErrorControl [in]

如果此服务在启动期间无法启动,则错误的严重性。 该值指示启动程序在发生故障时采取的操作。 所有错误都由系统记录。

忽略 (0)

不通知用户。

正常 (1)

正常。 通知用户。

严重 (2)

系统使用最后一个良好配置重启。

关键 (3)

系统将尝试使用正确的配置重新启动。

StartMode [in]

Windows 基本服务的启动模式。 有关详细信息,请参见“备注”部分。

启动

操作系统加载程序启动的设备驱动程序。 此值只对驱动程序服务有效。

系统

由操作系统初始化过程启动的设备驱动程序。 此值只对驱动程序服务有效。

自动

服务控制管理器将在系统启动期间自动启动。

手动

当进程调用 StartService 方法时,服务控制管理器要启动的服务。

已禁用

无法再启动的服务。

DesktopInteract [in]

如果 为 True,则服务可以在桌面上创建窗口或与窗口通信。

StartName [in]

运行服务的帐户名称。 根据服务类型,帐户名称可能采用 DomainName\Username 或 .\Username 的形式。 服务进程在运行时将使用这两种形式之一进行记录。 如果帐户属于内置域,则可以指定 .\Username。 如果指定 NULL ,服务将作为 LocalSystem 帐户登录。 对于内核或系统级驱动程序, StartName 包含驱动程序对象名称 (即 \FileSystem\Rdr 或 \Driver\Xns) , (I/O) 系统用来加载设备驱动程序。 如果指定 NULL,则驱动程序使用 I/O 系统基于服务名称创建的默认对象名称(例如“DWDOM\管理员”)运行。

还可以使用用户主体名称 (UPN) 格式指定 StartName,例如 ,Username@DomainName

StartPassword [in]

由 StartName 参数指定的帐户名的密码。 如果未更改密码,请指定 NULL 。 如果服务没有密码,请指定一个空字符串。

注意

将服务从本地系统更改为网络,或者从网络更改为本地系统时, StartPassword 必须是空字符串 (“”) ,而不是 NULL

LoadOrderGroup [in]

与之关联的组名称。 加载顺序组包含在系统注册表中,并确定服务加载到操作系统中的顺序。 如果指针为 NULL,或者它指向空字符串,则服务不属于组。 有关详细信息,请参见“备注”部分。

组之间的依赖关系应在 LoadOrderGroupDependencies 参数中列出。 首先启动负载排序组列表中的服务,然后启动不属于负载排序组列表中的组中的服务,然后启动不属于组的服务。 系统注册表的负载排序组列表位于:

\ HKEY_LOCAL_MACHINE系统\CurrentControlSet\控制\ServiceGroupOrder

LoadOrderGroupDependencies [in]

此服务启动之前必须启动的负载排序组的列表。 数组以 null 结尾为双倍。 如果指针为 NULL,或者如果指针指向空字符串,则服务没有依赖项。 组名必须以 Winsvc.h 文件中定义的 SC_GROUP_IDENTIFIER () 字符作为前缀,以便将其与服务名称区分开来,因为服务和服务组共享相同的命名空间。 对组的依赖意味着,如果至少一个组成员在尝试启动组的所有成员后正在运行,则此服务可以运行。

ServiceDependencies [in]

包含此服务启动前必须启动的服务名称的列表。 数组以 NULL 结尾为双倍。 如果指针为 NULL,或者如果指针指向空字符串,则服务没有依赖项。 对服务的依赖关系指示此服务仅当它所依赖的服务正在运行时才能运行。

返回值

返回以下列表中列出的值之一,或指示错误的任何其他值。 有关其他错误代码,请参阅 WMI 错误常量WbemErrorEnum。 有关常规 HRESULT 值,请参阅 系统错误代码

Success

0

已接受该请求。

不支持

1

不支持该请求。

拒绝访问

2

用户没有必要的访问权限。

正在运行的依赖服务

3

由于其他正在运行的服务依赖于该服务,不能停止该服务。

无效的服务控制

4

请求的控制代码无效或服务无法接受该控制代码。

服务无法接受控制

5

无法将请求的控制代码发送到服务,因为服务的状态 (Win32_BaseService状态 属性) 等于 0、1 或 2。

服务未处于活动状态

6

该服务尚未启动。

服务请求超时

7

该服务未及时响应启动请求。

未知失败

8

启动服务时出现未知失败。

找不到路径

9

找不到服务可执行文件的目录路径。

服务已在运行

10

服务已在运行。

服务数据库已锁定

11

要添加新服务的数据库已锁定。

已删除服务依赖项

12

此服务依赖的依赖项已从系统中删除。

服务依赖项失败

13

该服务无法从依赖的服务中找到所需的服务。

服务已禁用

14

已从系统禁用该服务。

服务登录失败

15

服务没有在该系统上运行所需的正确身份验证。

标记为要删除的服务

16

正在从系统中删除此服务。

服务无线程

17

服务没有执行线程。

状态循环依赖项

18

服务启动时具有循环依赖项。

状态重复名称

19

服务以同一名称运行。

状态名称无效

20

服务名称包含无效字符。

状态无效参数

21

已将无效参数传递给服务。

服务帐户状态无效

22

运行此服务的帐户无效或缺少运行服务的权限。

状态服务存在

23

系统的服务数据库中已存在该服务。

服务已暂停

24

该服务目前在系统中已暂停。

其他

25 4294967295

备注

当计算机启动时,所有自动启动服务也会启动。 有时,这些服务之一可能无法与计算机一起启动。 当服务在系统启动期间失败时,计算机会根据服务错误控制代码的值执行操作。

大多数服务都是使用 Normal 错误控制代码安装的。 使用 Ignore 错误代码安装的一些异常包括:

  • 文件复制服务
  • 智能卡
  • 辅助登录
  • WMI

对于使用 Ignore 错误代码安装的服务,不会向用户发出服务失败的通知。 如果更喜欢屏幕通知服务无法启动,则可以使用 WMI 更改错误控制代码。 错误控制代码仅适用于计算机启动;如果在计算机运行后停止并尝试重新启动服务,则不使用错误控制代码。

有时,可能需要更改运行给定服务的帐户。 例如,可以在管理帐户下运行服务。 由于这可能会造成安全漏洞,因此可以将服务切换到具有较少权限的帐户。 或者,你可能有在即将删除的帐户下运行的服务,或者你可能希望确保所有服务器上的某些服务在特定帐户下运行。 可以使用 Win32_Service 类的 Change 方法将服务配置为在指定的用户帐户下运行。 选择帐户时,请记住以下事项:

  • 用作服务帐户的帐户必须有权作为服务登录。 可以使用 组策略 授予此权限。

  • 用作服务帐户的帐户不应是本地、域或企业管理员组的成员。

  • 服务的每个实例都应在唯一的用户帐户下运行。 这可提供额外的安全性,并启用对单个服务实例的审核。

  • 如果服务是交互式的,则服务必须在 LocalSystem 帐户下运行。

    LocalSystem 是必需的,因为一次只能有一个窗口工作站 (WinSta0) 可见和交互。 如果服务在 LocalSystem 以外的帐户下运行,则它在 Service-0x03e7$\Default 窗口工作站中运行,这是一个不可见的窗口。 在此窗口工作站中运行的服务无法接收输入或显示输出。

将帐户分配给服务时,SCM 需要该帐户的正确密码才能进行分配。 如果提供的密码不正确,则 SCM 会拒绝该帐户。 如果使用 LocalSystem、LocalService 或 NetworkService 帐户配置服务帐户,则无需提供帐户密码,因为这些帐户没有密码。

SCM 将帐户密码存储在服务数据库中。 但是,分配密码后,SCM 不确保存储在服务数据库中的密码与分配给 Active Directory 中用户帐户的密码继续匹配。 因此,可能会出现类似于以下内容的情况:

  • 将服务配置为在特定用户帐户下运行。
  • 该服务使用当前帐户密码在该帐户下启动。
  • 更改用户帐户的密码。
  • 该服务将继续运行。 但是,如果服务停止,则无法重启它,因为 SCM 继续使用旧的无效密码。 更改 Active Directory 中的密码不会更改存储在服务数据库中的密码。

如果在常规用户帐户下运行服务,则每次用户帐户密码更改时,都需要更新这些服务密码。 如果不确定哪些服务在该帐户下运行,或者哪些计算机具有在该帐户下运行的服务,这可能特别耗时。 幸运的是,可以使用 WMI 在所有计算机上检查服务帐户,并在必要时更改服务帐户密码。

Win32_LoadOrderGroup 参数表示一组定义执行依赖项的系统服务。 服务必须按加载顺序组指定的顺序启动,因为服务相互依赖。 这些依赖服务需要存在前面的服务才能正常运行。

若要将服务从网络服务更改为本地系统 ,StartNameStartPassword 参数应具有以下值:

StartName = "LocalSystem"
StartPassword = "" // - empty string, not NULL

若要将服务从本地系统服务更改为网络, StartNameStartPassword 参数应具有以下值:

StartName = "NT AUTHORITY\NetworkService"
StartPassword = "" // - empty string, not NULL

示例

以下 VBScript 将服务的服务帐户从在指定的用户帐户下运行更改为 LocalSystem。

strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\Root\CIMv2")
Set colServiceList = objWMIService.ExecQuery("SELECT * FROM Win32_Service WHERE StartName = '.\\NetSvc'")
For Each objService in colServices
 errServiceChange = objService.Change( , , , , , , ".\LocalSystem" , "")
Next

以下 VBScript 更改在 Netsvc 下运行的所有脚本的服务帐户密码

strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\Root\CIMv2")
Set colServiceList = objWMIService.ExecQuery("SELECT * FROM Win32_Service WHERE StartName = '.\\NetSvc'")
For Each objservice in colServiceList
 errReturn = objService.Change( , , , , , , , "password")
Next

要求

要求
最低受支持的客户端
Windows Vista
最低受支持的服务器
Windows Server 2008
命名空间
Root\CIMV2
标头
Mbnapi.h
MOF
CIMWin32.mof
DLL
CIMWin32.dll

另请参阅

操作系统类

Win32_Service

WMI 任务:服务