EnumServicesStatusExA 函数 (winsvc.h)

枚举指定服务控制管理器数据库中的服务。 提供了每个服务的名称和状态,以及基于指定信息级别的其他数据。

语法

BOOL EnumServicesStatusExA(
  [in]                SC_HANDLE    hSCManager,
  [in]                SC_ENUM_TYPE InfoLevel,
  [in]                DWORD        dwServiceType,
  [in]                DWORD        dwServiceState,
  [out, optional]     LPBYTE       lpServices,
  [in]                DWORD        cbBufSize,
  [out]               LPDWORD      pcbBytesNeeded,
  [out]               LPDWORD      lpServicesReturned,
  [in, out, optional] LPDWORD      lpResumeHandle,
  [in, optional]      LPCSTR       pszGroupName
);

参数

[in] hSCManager

服务控制管理器数据库的句柄。 此句柄由 OpenSCManager 函数返回,并且必须具有 SC_MANAGER_ENUMERATE_SERVICE 访问权限。 有关详细信息,请参阅 服务安全和访问权限

[in] InfoLevel

要返回的服务属性。 使用 SC_ENUM_PROCESS_INFO 检索数据库中每个服务的名称和服务状态信息。 lpServices 参数是指向接收 ENUM_SERVICE_STATUS_PROCESS 结构的数组的缓冲区的指针。 缓冲区必须足够大,才能容纳其成员指向的结构和字符串。

目前,未定义其他信息级别。

[in] dwServiceType

要枚举的服务的类型。 此参数可以是以下一个或多个值。

价值 意义
SERVICE_DRIVER
0x0000000B
SERVICE_KERNEL_DRIVERSERVICE_FILE_SYSTEM_DRIVER类型的服务。
SERVICE_FILE_SYSTEM_DRIVER
0x00000002
文件系统驱动程序服务。
SERVICE_KERNEL_DRIVER
0x00000001
驱动程序服务。
SERVICE_WIN32
0x00000030
SERVICE_WIN32_OWN_PROCESSSERVICE_WIN32_SHARE_PROCESS类型的服务。
SERVICE_WIN32_OWN_PROCESS
0x00000010
在其自己的进程中运行的服务。
SERVICE_WIN32_SHARE_PROCESS
0x00000020
与一个或多个其他服务共享进程的服务。 有关详细信息,请参阅 服务程序

[in] dwServiceState

要枚举的服务的状态。 此参数可以是下列值之一。

价值 意义
SERVICE_ACTIVE
0x00000001
枚举处于以下状态的服务:SERVICE_START_PENDINGSERVICE_STOP_PENDINGSERVICE_RUNNINGSERVICE_CONTINUE_PENDINGSERVICE_PAUSE_PENDINGSERVICE_PAUSED
SERVICE_INACTIVE
0x00000002
枚举处于 SERVICE_STOPPED 状态的服务。
SERVICE_STATE_ALL
0x00000003
合并 SERVICE_ACTIVESERVICE_INACTIVE 状态。

[out, optional] lpServices

指向接收状态信息的缓冲区的指针。 此数据的格式取决于 InfoLevel 参数的值。

此数组的最大大小为 256K 字节。 若要确定所需的大小,请为此参数指定 NULL,并为 cbBufSize 参数指定 0。 该函数将失败,GetLastError 将返回 ERROR_MORE_DATA 参数将接收所需的大小。

Windows Server 2003 和 Windows XP:此数组的最大大小为 64K 字节。 从 SP1 和 SP2 的 Windows XP 增加到 Windows Server 2003 时,此限制已增加。

[in] cbBufSize

lpServices 参数指向的缓冲区的大小(以字节为单位)。

[out] pcbBytesNeeded

指向一个变量的指针,如果缓冲区太小,则接收返回剩余服务条目所需的字节数。

[out] lpServicesReturned

指向接收返回的服务条目数的变量的指针。

[in, out, optional] lpResumeHandle

指向一个变量的指针,该变量在输入中指定枚举的起点。 首次调用 EnumServicesStatusEx 函数时,必须将此值设置为零。 在输出中,如果函数成功,则此值为零。 但是,如果函数返回零,并且 GetLastError 函数返回 ERROR_MORE_DATA,则此值指示调用 EnumServicesStatusEx 函数以检索其他数据时要读取的下一个服务条目。

[in, optional] pszGroupName

加载顺序组名称。 如果此参数是字符串,则枚举的唯一服务是属于具有字符串指定名称的组的服务。 如果此参数为空字符串,则仅枚举不属于任何组的服务。 如果此参数 NULL,则忽略组成员身份并枚举所有服务。

返回值

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

如果函数失败,则返回值为零。 若要获取扩展的错误信息,请调用 GetLastError。 可能会返回以下错误。

返回代码 描述
ERROR_ACCESS_DENIED
句柄没有 SC_MANAGER_ENUMERATE_SERVICE 访问权限。
ERROR_MORE_DATA
缓冲区太小。 不能返回活动数据库中的所有数据。 参数包含接收剩余条目所需的字节数。
ERROR_INVALID_PARAMETER
使用了非法参数值。
ERROR_INVALID_HANDLE
句柄无效。
ERROR_INVALID_LEVEL
InfoLevel 参数包含不受支持的值。
ERROR_SHUTDOWN_IN_PROGRESS
系统正在关闭;无法调用此函数。

言论

如果调用方对服务没有 SERVICE_QUERY_STATUS 访问权限,则会从返回到客户端的服务列表中以无提示方式省略该服务。

注意

winsvc.h 标头将 EnumServicesStatusEx 定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的 约定。

要求

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

另请参阅

ENUM_SERVICE_STATUS_PROCESS

Service Functions

服务安装、删除和枚举