服務安全性和存取權限

Windows 安全性模型可讓您控制服務控制管理員的存取權, (SCM) 和服務物件。 下列各節提供詳細資訊:

服務控制管理員的存取權限

以下是 SCM 的特定存取權限。

存取權限 Description
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 的 一般存取權限

存取權限 Description
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 的安全性描述元。 此行為自 Windows Server 2003 起變更,Service Pack 1 (SP1) 。

系統會授與下列存取權限。

帳戶 存取權限
遠端驗證的使用者
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
系統管理員
SC_MANAGER_ALL_ACCESS

請注意,透過網路驗證但未以互動方式登入的遠端使用者可以連線到 SCM,但無法執行需要其他存取權限的作業。 若要執行這些作業,使用者必須以互動方式登入,否則服務必須使用其中一個服務帳戶。

Windows Server 2003 和 Windows XP: 遠端驗證的使用者會被授與 SC_MANAGER_CONNECTSC_MANAGER_ENUMERATE_SERVICESC_MANAGER_QUERY_LOCK_STATUSSTANDARD_RIGHTS_READ 存取權限。 從 Windows Server 2003 SP1 起,這些存取權限會受到限制,如上表所述

當進程使用 OpenSCManager 函式來開啟已安裝服務的資料庫控制碼時,它可以要求存取權限。 系統會先對 SCM 的安全性描述項執行安全性檢查,再授與要求的存取權限。

服務的存取權限

以下是服務的特定存取權限。

存取權限 Description
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 函式以指定使用者定義控制項程式碼的必要專案。

以下是服務 的標準存取權限

存取權限 Description
ACCESS_SYSTEM_SECURITY 需要呼叫 QueryServiceObjectSecuritySetServiceObjectSecurity 函式才能存取 SACL。 取得此存取權的適當方式是在呼叫端的目前存取權杖中啟用 SE_SECURITY_NAME許可權 、開啟 ACCESS_SYSTEM_SECURITY 存取的控制碼,然後停用許可權。
DELETE (0x10000) 需要呼叫 DeleteService 函式才能刪除服務。
READ_CONTROL (0x20000) 呼叫 QueryServiceObjectSecurity 函式以查詢服務物件的安全性描述元時需要。
WRITE_DAC (0x40000) 需要呼叫 SetServiceObjectSecurity 函式,才能修改服務物件之安全性描述元的 Dacl 成員。
WRITE_OWNER (0x80000) 需要呼叫SetServiceObjectSecurity函式,才能修改服務物件之安全性描述元的擁有者和群組成員。

以下是服務的 一般存取權限

存取權限 Description
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

CreateService 函式安裝服務時,SCM 會建立服務物件的安全性描述元。 服務物件的預設安全性描述元會授與下列存取權。

帳戶 存取權限
遠端驗證的使用者 預設不會授與。Windows Server 2003 SP1: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
系統管理員
刪除
READ_CONTROL
SERVICE_ALL_ACCESS
WRITE_DAC
WRITE_OWNER

若要執行任何作業,使用者必須以互動方式登入,否則服務必須使用其中一個服務帳戶。

若要取得或設定服務物件的安全性描述元,請使用 QueryServiceObjectSecuritySetServiceObjectSecurity 函式。 如需詳細資訊,請參閱 修改服務的 DACL

當進程使用 OpenService 函式時,系統會針對服務物件的安全性描述元檢查所要求的存取權限。

將特定存取權限授與未受信任的 (使用者,例如 SERVICE_CHANGE_CONFIGSERVICE_STOP) 可讓他們干擾服務的執行,並可能允許他們以 LocalSystem 帳戶執行應用程式。

呼叫 EnumServicesStatusEx 函 式時,如果呼叫端沒有服務的 SERVICE_QUERY_STATUS 存取權,服務就會從傳回給用戶端的服務清單中以無訊息方式省略。