服务安全性和访问权限
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) | 调用 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 |
SC_MANAGER_ENUMERATE_SERVICE SC_MANAGER_QUERY_LOCK_STATUS |
GENERIC_WRITE |
SC_MANAGER_CREATE_SERVICE SC_MANAGER_MODIFY_BOOT_CONFIG |
GENERIC_EXECUTE |
SC_MANAGER_CONNECT SC_MANAGER_LOCK |
GENERIC_ALL |
|
具有正确访问权限的进程可以打开可在 OpenService、EnumServicesStatusEx和 QueryServiceLockStatus 函数中使用的 SCM 的句柄。 只有具有管理员权限的进程才能打开 SCM 的句柄,CreateService 和 LockServiceDatabase 函数可以使用该句柄。
系统为 SCM 创建安全描述符。 若要获取或设置 SCM 的安全描述符,请使用具有 SCManager 对象的句柄的 QueryServiceObjectSecurity 和 SetServiceObjectSecurity 函数。
Windows Server 2003 和 Windows XP: 与大多数其他安全对象不同,无法修改 SCM 的安全描述符。 自 Windows Server 2003 Service Pack 1(SP1)起,此行为已更改。
授予以下访问权限。
帐户 | 访问权限 |
---|---|
远程经过身份验证的用户 |
|
本地经过身份验证的用户(包括 LocalService 和 NetworkService) |
SC_MANAGER_ENUMERATE_SERVICE SC_MANAGER_QUERY_LOCK_STATUS STANDARD_RIGHTS_READ |
LocalSystem |
SC_MANAGER_ENUMERATE_SERVICE SC_MANAGER_MODIFY_BOOT_CONFIG SC_MANAGER_QUERY_LOCK_STATUS STANDARD_RIGHTS_READ |
管理员 |
|
请注意,通过网络进行身份验证但无法以交互方式登录的远程用户可以连接到 SCM,但不能执行需要其他访问权限的作。 若要执行这些作,用户必须以交互方式登录,或者服务必须使用其中一个服务帐户。
Windows Server 2003 和 Windows XP: 远程经过身份验证的用户被授予 SC_MANAGER_CONNECT、SC_MANAGER_ENUMERATE_SERVICE、SC_MANAGER_QUERY_LOCK_STATUS和 STANDARD_RIGHTS_READ 访问权限。 与 Windows Server 2003 SP1 一样,这些访问权限受到限制
当进程使用 OpenSCManager 函数打开已安装服务的数据库的句柄时,它可以请求访问权限。 在授予请求的访问权限之前,系统会针对 SCM 的安全描述符执行安全检查。
服务的访问权限
以下是服务的特定访问权限。
访问权限 | 描述 |
---|---|
SERVICE_ALL_ACCESS(0xF01FF) | 除了此表中的所有访问权限之外,还包括 STANDARD_RIGHTS_REQUIRED。 |
SERVICE_CHANGE_CONFIG(0x0002) | 调用 ChangeServiceConfig 或 ChangeServiceConfig2 函数以更改服务配置所必需的。 由于这会授予调用方更改系统运行的可执行文件的权限,因此应仅向管理员授予它。 |
SERVICE_ENUMERATE_DEPENDENTS(0x0008) | 调用 EnumDependentServices 函数以枚举依赖于服务的所有服务所必需的。 |
SERVICE_INTERROGATE(0x0080) | 需要调用 ControlService 函数,以要求服务立即报告其状态。 |
SERVICE_PAUSE_CONTINUE(0x0040) | 调用 ControlService 函数以暂停或继续服务所必需的。 |
SERVICE_QUERY_CONFIG(0x0001) | 调用 QueryServiceConfig 并 QueryServiceConfig2 函数来查询服务配置所必需的。 |
SERVICE_QUERY_STATUS(0x0004) | 调用 QueryServiceStatus 或 QueryServiceStatusEx 函数时需要向服务控制管理器询问服务的状态。 调用 NotifyServiceStatusChange 函数以在服务更改状态时接收通知所必需的。 |
SERVICE_START(0x0010) | 需要调用 StartService 函数来启动服务。 |
SERVICE_STOP(0x0020) | 调用 ControlService 函数以停止服务所必需的。 |
SERVICE_USER_DEFINED_CONTROL(0x0100) | 调用 ControlService 函数以指定用户定义的控件代码所必需的。 |
以下是服务的 标准访问权限。
访问权限 | 描述 |
---|---|
ACCESS_SYSTEM_SECURITY | 调用 QueryServiceObjectSecurity 或 SetServiceObjectSecurity 函数以访问 SACL 所必需的。 获取此访问权限的正确方法是在调用方当前访问令牌中启用 SE_SECURITY_NAME特权,打开 ACCESS_SYSTEM_SECURITY 访问句柄,然后禁用特权。 |
DELETE (0x10000) | 需要调用 DeleteService 函数来删除服务。 |
READ_CONTROL(0x20000) | 调用 QueryServiceObjectSecurity 函数以查询服务对象的安全描述符所必需的。 |
WRITE_DAC(0x40000) | 调用 SetServiceObjectSecurity 函数以修改服务对象的安全描述符 Dacl 成员。 |
WRITE_OWNER (0x80000) | 调用 SetServiceObjectSecurity 函数以修改 所有者 和 组 服务对象的安全描述符的成员。 |
以下是服务的 通用访问权限。
访问权限 | 描述 |
---|---|
GENERIC_READ |
SERVICE_QUERY_CONFIG SERVICE_QUERY_STATUS SERVICE_INTERROGATE SERVICE_ENUMERATE_DEPENDENTS |
GENERIC_WRITE |
SERVICE_CHANGE_CONFIG |
GENERIC_EXECUTE |
SERVICE_START SERVICE_STOP SERVICE_PAUSE_CONTINUE SERVICE_USER_DEFINED_CONTROL |
当服务由 CreateService 函数安装服务时,SCM 将创建服务对象的安全描述符。 服务对象的默认安全描述符授予以下访问权限。
帐户 | 访问权限 |
---|---|
远程经过身份验证的用户 | 默认情况下未授予。使用 SP1Windows Server 2003:SERVICE_USER_DEFINED_CONTROL Windows Server 2003 和 Windows XP: 远程经过身份验证的用户的访问权限与本地经过身份验证的用户的访问权限相同。 |
本地经过身份验证的用户(包括 LocalService 和 NetworkService) |
SERVICE_ENUMERATE_DEPENDENTS SERVICE_INTERROGATE SERVICE_QUERY_CONFIG SERVICE_QUERY_STATUS SERVICE_USER_DEFINED_CONTROL |
LocalSystem |
SERVICE_ENUMERATE_DEPENDENTS SERVICE_INTERROGATE SERVICE_PAUSE_CONTINUE SERVICE_QUERY_CONFIG SERVICE_QUERY_STATUS SERVICE_START SERVICE_STOP SERVICE_USER_DEFINED_CONTROL |
管理员 |
READ_CONTROL SERVICE_ALL_ACCESS WRITE_DAC WRITE_OWNER |
若要执行任何作,用户必须以交互方式登录,或者服务必须使用其中一个服务帐户。
若要获取或设置服务对象的安全描述符,请使用 QueryServiceObjectSecurity 和 SetServiceObjectSecurity 函数。 有关详细信息,请参阅 修改服务的 DACL。
当进程使用 OpenService 函数时,系统会根据服务对象的安全描述符检查请求的访问权限。
向不受信任的用户(如 SERVICE_CHANGE_CONFIG 或 SERVICE_STOP)授予某些访问权限可能会让他们干扰服务的执行,并可能允许他们在 LocalSystem 帐户下运行应用程序。
当调用 EnumServicesStatusEx 函数 时,如果调用方没有对服务的 SERVICE_QUERY_STATUS 访问权限,则从返回到客户端的服务列表中以无提示方式省略该服务。