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 [仅限桌面应用]
目标平台 窗户
标头 winsvc.h (包括 Windows.h)
Advapi32.lib
DLL Advapi32.dll

另请参阅

CloseServiceHandle

CreateService

EnumServicesStatusEx

OpenService

SCM 句柄

Service Functions