服务安全性和访问权限

通过Windows安全模型,可以控制对服务控制管理器的访问, (SCM) 和服务对象。 以下部分提供了详细信息:

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

下面是 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

具有正确访问权限的进程可以打开可用于 OpenServiceEnumServicesStatusExQueryServiceLockStatus 函数的 SCM 的句柄。 只有具有管理员权限的进程才能打开可供 CreateServiceLockServiceDatabase 函数使用的 SCM 的句柄。

系统为 SCM 创建安全描述符。 若要获取或设置 SCM 的安全描述符,请使用 QueryServiceObjectSecuritySetServiceObjectSecurity 函数以及 SCManager 对象的句柄。

Windows Server 2003 和 Windows XP:与大多数其他安全对象不同,无法修改 SCM 的安全描述符。 从 Service Pack 1 (SP1) Windows Server 2003 起,此行为已更改。

授予以下访问权限。

帐户 访问权限
远程经过身份验证的用户
SC_MANAGER_CONNECT
本地经过身份验证的用户 (包括 LocalService 和 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,但不能执行需要其他访问权限的操作。 若要执行这些操作,用户必须以交互方式登录,否则服务必须使用其中一个服务帐户。

Windows Server 2003 和 Windows XP:远程经过身份验证的用户被授予SC_MANAGER_CONNECTSC_MANAGER_ENUMERATE_SERVICESC_MANAGER_QUERY_LOCK_STATUSSTANDARD_RIGHTS_READ访问权限。 与 SP1 Windows Server 2003 中所述,这些访问权限受到限制

当进程使用 OpenSCManager 函数打开已安装服务的数据库的句柄时,它可以请求访问权限。 在授予请求的访问权限之前,系统会针对 SCM 的安全描述符执行安全检查。

服务的访问权限

以下是服务的特定访问权限。

访问权限 描述
SERVICE_ALL_ACCESS (0xF01FF) 除了此表中的所有访问权限外,还包括 STANDARD_RIGHTS_REQUIRED
SERVICE_CHANGE_CONFIG (0x0002) 需要调用 ChangeServiceConfigChangeServiceConfig2 函数才能更改服务配置。 由于这授予调用方更改系统运行的可执行文件的权限,因此应仅向管理员授予该权限。
SERVICE_ENUMERATE_DEPENDENTS (0x0008) 调用 EnumDependentServices 函数以枚举依赖于服务的所有服务。
SERVICE_INTERROGATE (0x0080) 需要调用 ControlService 函数才能要求服务立即报告其状态。
SERVICE_PAUSE_CONTINUE (0x0040) 需要调用 ControlService 函数来暂停或继续服务。
SERVICE_QUERY_CONFIG (0x0001) 需要调用 QueryServiceConfigQueryServiceConfig2 函数来查询服务配置。
SERVICE_QUERY_STATUS (0x0004) 调用 QueryServiceStatusQueryServiceStatusEx 函数需要向服务控制管理器询问服务的状态。
调用 NotifyServiceStatusChange 函数以在服务更改状态时接收通知是必需的。
SERVICE_START (0x0010) 调用 StartService 函数以启动服务是必需的。
SERVICE_STOP (0x0020) 需要调用 ControlService 函数才能停止服务。
SERVICE_USER_DEFINED_CONTROL (0x0100) 需要调用 ControlService 函数才能指定用户定义的控件代码。

以下是服务 的标准访问权限

访问权限 说明
ACCESS_SYSTEM_SECURITY 需要调用 QueryServiceObjectSecuritySetServiceObjectSecurity 函数才能访问 SACL。 获取此访问权限的正确方法是在调用方当前访问令牌中启用 SE_SECURITY_NAMEprivilege,打开ACCESS_SYSTEM_SECURITY访问句柄,然后禁用该权限。
DELETE (0x10000) 需要调用 DeleteService 函数才能删除服务。
READ_CONTROL (0x20000) 调用 QueryServiceObjectSecurity 函数以查询服务对象的安全描述符是必需的。
WRITE_DAC (0x40000) 调用 SetServiceObjectSecurity 函数以修改服务对象的安全描述符的 Dacl 成员所必需的。
WRITE_OWNER (0x80000) 调用 SetServiceObjectSecurity 函数以修改服务对象的安全描述符的 所有者 成员所必需的。

以下是服务的 通用访问权限

访问权限 说明
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

SCM 在 CreateService 函数安装服务时创建服务对象的安全描述符。 服务对象的默认安全描述符授予以下访问权限。

帐户 访问权限
远程经过身份验证的用户 默认情况下未授予。sp1 Windows Server 2003:SERVICE_USER_DEFINED_CONTROL
Windows Server 2003 和 Windows XP:远程经过身份验证的用户的访问权限与本地经过身份验证的用户的访问权限相同。
本地经过身份验证的用户 (包括 LocalService 和 NetworkService)
READ_CONTROL
SERVICE_ENUMERATE_DEPENDENTS
SERVICE_INTERROGATE
SERVICE_QUERY_CONFIG
SERVICE_QUERY_STATUS
SERVICE_USER_DEFINED_CONTROL
LocalSystem
READ_CONTROL
SERVICE_ENUMERATE_DEPENDENTS
SERVICE_INTERROGATE
SERVICE_PAUSE_CONTINUE
SERVICE_QUERY_CONFIG
SERVICE_QUERY_STATUS
SERVICE_START
SERVICE_STOP
SERVICE_USER_DEFINED_CONTROL
Administrators
DELETE
READ_CONTROL
SERVICE_ALL_ACCESS
WRITE_DAC
WRITE_OWNER

若要执行任何操作,用户必须以交互方式登录,否则服务必须使用其中一个服务帐户。

若要获取或设置服务对象的安全描述符,请使用 QueryServiceObjectSecuritySetServiceObjectSecurity 函数。 有关详细信息,请参阅 修改服务的 DACL

当进程使用 OpenService 函数时,系统会根据服务对象的安全描述符检查请求的访问权限。

向不受信任的用户授予某些访问权限, ((例如 SERVICE_CHANGE_CONFIGSERVICE_STOP) )可以允许他们干扰服务的执行,并可能允许他们在 LocalSystem 帐户下运行应用程序。

调用 EnumServicesStatusEx 函数 时,如果调用方对服务没有 SERVICE_QUERY_STATUS 访问权限,则从返回到客户端的服务列表中以无提示方式省略该服务。