OpenSCManager功能在指定的计算机上建立与服务控制管理器的连接,并打开指定的数据库。
SC_HANDLE OpenSCManager(
LPCTSTR 【lpMachineName】, | //指向机器名字符串的指针 |
LPCTSTR 【lpDatabaseName】, | //指向数据库名字符串的指针 |
DWORD 【dwDesiredAccess】 | //访问类型 |
); |
参数
【lpMachineName】
指向以目标计算机命名的以null结尾的字符串。如果指针为NULL或指向空字符串,则该函数将连接到本地计算机上的服务控制管理器。
【lpDatabaseName】
指向以空字符结尾的字符串,命名要打开的服务控制管理器数据库。该字符串应指定ServicesActive。如果指针为NULL,则默认情况下会打开ServicesActive数据库。
【dwDesiredAccess】
指定对服务控制管理器的访问。在授予所请求的访问之前,系统根据与服务控制管理器对象相关联的安全描述符的自由访问控制列表来检查调用进程的访问令牌。通过调用此函数隐式指定SC_MANAGER_CONNECT访问类型。此外,可以指定以下服务控制管理器对象访问类型中的任何或全部:
类型 | 描述 | ||||
SC_MANAGER_ALL_ACCESS | |||||
包括STANDARD_RIGHTS_REQUIRED,以及此表中列出的所有访问类型。 | |||||
SC_MANAGER_CONNECT | |||||
启用连接到服务控制管理器。 | |||||
SC_MANAGER_CREATE_SERVICE | |||||
启用CreateService函数来创建服务对象并将其添加到数据库。 | |||||
SC_MANAGER_ENUMERATE_SERVICE | |||||
启用EnumServicesStatus功能来列出数据库中的服务。 | |||||
SC_MANAGER_LOCK | |||||
启用LockServiceDatabase函数来获取数据库上的锁定。 | |||||
SC_MANAGER_QUERY_LOCK_STATUS | |||||
启用QueryServiceLockStatus函数来检索数据库的锁定状态信息。 |
【dwDesiredAccess】参数可以指定以下通用访问类型中的任何一个或全部:
通用访问 | 服务管理器访问 |
GENERIC_READ | 组合以下访问:STANDARD_RIGHTS_READ,SC_MANAGER_ENUMERATE_SERVICE和SC_MANAGER_QUERY_LOCK_STATUS。 |
GENERIC_WRITE | 组合以下访问:STANDARD_RIGHTS_WRITE,SC_MANAGER_CREATE_SERVICE和SC_MANAGER_MODIFY_BOOT_CONFIG。 |
GENERIC_EXECUTE | 组合以下访问:STANDARD_RIGHTS_EXECUTE,SC_MANAGER_CONNECT和SC_MANAGER_LOCK。 |
返回值
如果函数成功,则返回值是指定的服务控制管理器数据库的句柄。
如果函数失败,返回值为NULL。要获取扩展错误信息,请调用GetLastError.
错误
服务控制管理器可以设置以下错误代码。其他错误代码可以由服务控制管理器调用的注册表函数设置。
错误代码 | 含义 |
ERROR_ACCESS_DENIED | 请求的访问被拒绝。 |
ERROR_DATABASE_DOES_NOT_EXIST | 指定的数据库不存在。 |
ERROR_INVALID_PARAMETER | 指定的参数无效。 |
备注
当进程使用OpenSCManager函数打开服务控制管理器数据库的句柄时,系统将在授予所请求的访问权限之前执行安全检查。允许所有进程SC_MANAGER_CONNECT,SC_MANAGER_ENUMERATE_SERVICE和SC_MANAGER_QUERY_LOCK_STATUS访问所有服务控制管理器数据库。这使得任何进程能够打开可在OpenService,EnumServicesStatus和QueryServiceLockStatus函数中使用的服务控制管理器数据库句柄。只有具有管理员权限的进程才能打开CreateService和LockServiceDatabase函数使用的数据库句柄。
如果启用了适当的访问权限,调用进程可以使用返回的句柄来标识以下函数中的数据库:
CreateService
EnumServicesStatus
LockServiceDatabase
OpenService
QueryServiceLockStatus
返回的句柄仅对称为OpenSCManager函数的进程有效。可以通过调用CloseServiceHandle函数关闭它。
也可以看看
CloseServiceHandle, CreateService, EnumServicesStatus, LockServiceDatabase, OpenService, QueryServiceLockStatus