在指定的计算机上建立与服务控制管理器的连接,并打开指定的服务控制管理器数据库。
函数原型:
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) | 调用EnumServicesStatus或EnumServicesStatusEx函数以列出数据库中的服务是必需的。创建或删除任何服务时 ,调用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