OpenSCManagerA 函数 (winsvc.h)

与指定计算机上的服务控制管理器建立连接,并打开指定的服务控制管理器数据库。

语法

SC_HANDLE OpenSCManagerA(
  [in, optional] LPCSTR lpMachineName,
  [in, optional] LPCSTR lpDatabaseName,
  [in]           DWORD  dwDesiredAccess
);

参数

[in, optional] lpMachineName

目标计算机的名称。 如果指针为 NULL 或指向空字符串,则函数将连接到本地计算机上的服务控制管理器。

[in, optional] lpDatabaseName

服务控制管理器数据库的名称。 此参数应设置为 SERVICES_ACTIVE_DATABASE。 如果为 NULL,则默认打开SERVICES_ACTIVE_DATABASE数据库。

[in] dwDesiredAccess

对服务控制管理器的访问。 有关访问权限的列表,请参阅 服务安全性和访问权限

在授予请求的访问权限之前,系统会根据与服务控制管理器关联的安全描述符的任意访问控制列表检查调用进程的访问令牌。

SC_MANAGER_CONNECT访问权限是通过调用此函数隐式指定的。

返回值

如果函数成功,则返回值是指定服务控制管理器数据库的句柄。

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

SCM 可以设置以下错误代码。 其他错误代码可由 SCM 调用的注册表函数设置。

返回代码 说明
ERROR_ACCESS_DENIED
请求的访问被拒绝。
ERROR_DATABASE_DOES_NOT_EXIST
指定的数据库不存在。

注解

当进程使用 OpenSCManager 函数打开服务控制管理器数据库的句柄时,系统会在授予请求的访问权限之前执行安全检查。 有关详细信息,请参阅 服务安全性和访问权限

如果当前用户在连接到另一台计算机上的服务时没有适当的访问权限, 则 OpenSCManager 函数调用将失败。 若要远程连接到服务,请使用 LOGON32_LOGON_NEW_CREDENTIALS 调用 LogonUser 函数,然后在调用 OpenSCManager 之前调用 ImpersonateLoggedOnUser。 有关远程连接到服务的详细信息,请参阅 服务和 RPC/TCP

只有具有管理员权限的进程才能打开可由 CreateService 函数使用的数据库句柄。

返回的句柄仅对调用 OpenSCManager 函数的进程有效。 可以通过调用 CloseServiceHandle 函数将其关闭。

示例

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

注意

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

要求

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

另请参阅

CloseServiceHandle

CreateService

EnumServicesStatusEx

OpenService

SCM 句柄

服务函数