打开服务控制管理器OpenSCManagerW

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

函数原型:
SC_HANDLE OpenSCManagerW(
LPCWSTR lpMachineName,
LPCWSTR lpDatabaseName,
DWORD dwDesiredAccess
);

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

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

参数3:访问服务控制管理器。

服务控制管理器的访问权限

以下是SCM的特定访问权限。

服务控制管理器的访问权限
访问权 描述
SC_MANAGER_ALL_ACCESS(0xF003F) 除了此表中的所有访问权限之外,还包括STANDARD_RIGHTS_REQUIRED
SC_MANAGER_CREATE_SERVICE(0x0002) 调用CreateService函数来创建服务对象并将其添加到数据库中是必需的。
SC_MANAGER_CONNECT(0x0001) 连接到服务控制管理器所需。
SC_MANAGER_ENUMERATE_SERVICE(0x0004) 调用EnumServicesStatusEnumServicesStatusEx函数以列出数据库中的服务是必需的。创建或删除任何服务时
,调用NotifyServiceStatusChange函数以接收通知是必需的。
SC_MANAGER_LOCK(0x0008) 调用LockServiceDatabase函数以获取数据库锁是必需的。
SC_MANAGER_MODIFY_BOOT_CONFIG(0x0020) 调用NotifyBootConfigStatus函数所需。
SC_MANAGER_QUERY_LOCK_STATUS(0x0010) 调用QueryServiceLockStatus函数以检索数据库的锁状态信息所必需。

以下是SCM的常规访问权限

服务控制管理器的访问权限
访问权 描述
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

注意:权限要采取用多少申请多少的原则。

https://docs.microsoft.com/en-us/windows/win32/api/winsvc/nf-winsvc-openscmanagerw