【原创】驱动加载之OpenSCManager

  1. SC_HANDLE WINAPI OpenSCManager(
  2. _In_opt_ LPCTSTR lpMachineName,
  3. _In_opt_ LPCTSTR lpDatabaseName,
  4. _In_ DWORD dwDesiredAccess
  5. );
函数作用:以一定的权限,在指定的计算机打开指定的SCM数据库
参数:
1. lpMachineName:目标计算机名,NULL表示本地计算机
2. lpDatabaseName:服务管理程序系统组件数据库,可以设为SERVICES_ACTIVE_DATABASE,如果为NULL,表示默认打开SERVICES_ACTIVE_DATABASE数据库
3. dwDesiredAccess:对SCM的权限,可以是以下这一些:
Access rightDescription
SC_MANAGER_ALL_ACCESS (0xF003F)Includes STANDARD_RIGHTS_REQUIRED, in addition to all access rights in this table.
SC_MANAGER_CREATE_SERVICE (0x0002)Required to call the CreateService function to create a service object and add it to the database.
SC_MANAGER_CONNECT (0x0001)Required to connect to the service control manager.
SC_MANAGER_ENUMERATE_SERVICE (0x0004)

Required to call the EnumServicesStatus or EnumServicesStatusEx function to list the services that are in the database.

Required to call the NotifyServiceStatusChange function to receive notification when any service is created or deleted.

SC_MANAGER_LOCK (0x0008)Required to call the LockServiceDatabase function to acquire a lock on the database.
SC_MANAGER_MODIFY_BOOT_CONFIG (0x0020)Required to call the NotifyBootConfigStatus function.
SC_MANAGER_QUERY_LOCK_STATUS (0x0010)Required to call the QueryServiceLockStatus function to retrieve the lock status information for the database.
或者上面权限的组合:
Access rightDescription
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
GENERIC_ALL
SC_MANAGER_ALL_ACCESS
一个有适当权限的普通程序能够打开SCM句柄,供 OpenService EnumServicesStatusEx , 和  QueryServiceLockStatus 函数使用;
只有拥有Administrator权限的程序打开的SCM句柄,才可用于 CreateService  和  LockServiceDatabase 函数
不同用户拥有不同的权限,在获取所需要的权限前,要检查程序所拥有的权限:
AccountAccess rights
Remote authenticated users
SC_MANAGER_CONNECT
Local authenticated users (including LocalService and NetworkService)
SC_MANAGER_CONNECT
SC_MANAGER_ENUMERATE_SERVICE
SC_MANAGER_QUERY_LOCK_STATUS
STANDARD_RIGHTS_READ
LocalSystem
SC_MANAGER_CONNECT
SC_MANAGER_ENUMERATE_SERVICE
SC_MANAGER_MODIFY_BOOT_CONFIG
SC_MANAGER_QUERY_LOCK_STATUS
STANDARD_RIGHTS_READ
Administrators
SC_MANAGER_ALL_ACCESS
 
返回值:
成功,返回指定SCM数据库的句柄;失败返回NULL,错误码可通过调用GetLastError获得。
Return codeDescription
ERROR_ACCESS_DENIED

The requested access was denied.

ERROR_DATABASE_DOES_NOT_EXIST

The specified database does not exist.

说明:
(1)在获取SCM的相关权限前,系统会对程序进行一定的权限检查,是否符合权限要求
(2)当程序在连接其他计算机上的服务时,程序没有适当的权限,那么 OpenSCManager 将会调用失败, . To connect to a service remotely, call the LogonUser function with LOGON32_LOGON_NEW_CREDENTIALS and then call ImpersonateLoggedOnUser before calling OpenSCManager.为了远程链接一个服务,可以用 LOGON32_LOGON_NEW_CREDENTIALS 调用 LogonUser 函数然后再调用 ImpersonateLoggedOnUser
(3) 只有拥有Administrator权限的程序打开的SCM句柄,才可用于 CreateService  和  LockServiceDatabase 函数
(4) OpenSCManager 函数返回的句柄只能由调用它的进程使用,可以调用CloseServiceHandle函数来关掉这个句柄。


本文链接:http://www.cnblogs.com/cposture/p/4717468.html

转载于:https://www.cnblogs.com/cposture/p/4717468.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值