OpenService功能打开现有服务的句柄。
SC_HANDLE OpenService(
SC_HANDLE 【hSCManager】, | //处理服务控制管理器数据库 |
LPCTSTR 【lpServiceName】, | //指向要启动的服务的名称 |
DWORD 【dwDesiredAccess】 | //访问服务类型 |
); |
参数
【hSCManager】
标识服务控制管理器(SCM)数据库。OpenSCManager函数返回此句柄。
【lpServiceName】
指向以空字符结尾的字符串,命名要打开的服务。最大字符串长度为256个字符。SCM数据库保留字符的大小写,但服务名称比较始终不区分大小写。斜杠(/),反斜杠(\\),逗号和空格是无效的服务名称字符。
【dwDesiredAccess】
指定对服务的访问。在授予所请求的访问之前,系统根据与服务对象相关联的安全描述符的自由访问控制列表检查调用进程的访问令牌。可以指定以下任何或全部服务对象访问类型:
访问 | 描述 |
SERVICE_ALL_ACCESS | 除了表中列出的所有访问类型之外,还包括STANDARD_RIGHTS_REQUIRED。 |
SERVICE_CHANGE_CONFIG | 启用ChangeServiceConfig功能来更改服务配置。 |
SERVICE_ENUMERATE_DEPENDENTS | 启用EnumDependentServices函数来枚举所有依赖服务的服务。 |
SERVICE_INTERROGATE | 启用ControlService功能来请求服务立即报告其状态。 |
SERVICE_PAUSE_CONTINUE | 启用ControlService功能来暂停或继续服务。 |
SERVICE_QUERY_CONFIG | 启用QueryServiceConfig功能查询服务配置。 |
SERVICE_QUERY_STATUS | 允许调用QueryServiceStatus功能向服务控制管理员询问该服务的状态。 |
SERVICE_START | 启用StartService功能启动服务。 |
SERVICE_STOP | 启用ControlService功能来停止服务。 |
SERVICE_USER_DEFINED_CONTROL | 启用ControlService功能来指定用户定义的控制代码。 |
STANDARD_RIGHTS_REQUIRED启用以下服务对象访问类型:
标准权利 | 描述 |
DELETE | 启用DeleteService功能来删除该服务。 |
READ_CONTROL | 启用QueryServiceObjectSecurity函数来查询服务对象的安全描述符。 |
WRITE_DAC|WRITE_OWNER | 启用SetServiceObjectSecurity功能来修改服务对象的安全描述符。 |
【dwDesiredAccess】参数可以指定以下通用访问类型中的任何一种或全部:
通用访问 | 服务访问 |
GENERIC_READ | 组合以下访问:STANDARD_RIGHTS_READ,SERVICE_QUERY_CONFIG,SERVICE_QUERY_STATUS,SERVICE_INTERROGATE和SERVICE_ENUMERATE_DEPENDENTS。 |
GENERIC_WRITE | 结合以下访问权限:STANDARD_RIGHTS_WRITE和SERVICE_CHANGE_CONFIG。 |
GENERIC_EXECUTE | 组合以下访问:STANDARD_RIGHTS_EXECUTE,SERVICE_START,SERVICE_STOP,SERVICE_PAUSE_CONTINUE和SERVICE_USER_DEFINED_CONTROL。 |
返回值
如果函数成功,则返回值是该服务的句柄。
如果函数失败,返回值为NULL。要获取扩展错误信息,请调用GetLastError.
错误
服务控制管理器可以设置以下错误代码。其他可以由服务控制管理器调用的注册表功能设置。
错误代码 | 含义 |
ERROR_ACCESS_DENIED | 指定的服务控制管理器数据库句柄无法访问该服务。 |
ERROR_INVALID_HANDLE | 指定的句柄无效。 |
ERROR_INVALID_NAME | 指定的服务名称无效。 |
ERROR_SERVICE_DOES_NOT_EXIST | 指定的服务不存在。 |
备注
如果启用了适当的访问权限,调用进程可以使用返回的句柄来标识以下功能中的服务:
ChangeServiceConfig
ControlService
DeleteService
EnumDependentServices
QueryServiceConfig
QueryServiceObjectSecurity
QueryServiceStatus
SetServiceObjectSecurity
StartService
返回的句柄仅对称为OpenService的进程有效。可以通过调用CloseServiceHandle函数关闭它。
也可以看看
ChangeServiceConfig, ControlService, CreateService, DeleteService, EnumDependentServices, OpenSCManager, QueryServiceConfig, QueryServiceObjectSecurity, QueryServiceStatus, SetServiceObjectSecurity, StartService