服務安全性和存取權限
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) | 需要呼叫 EnumServicesStatus 或 EnumServicesStatusEx 函式,以列出資料庫中的服務。 呼叫 NotifyServiceStatusChange 函式以在建立或刪除任何服務時接收通知的必要條件。 |
SC_MANAGER_LOCK (0x0008) | 需要呼叫 LockServiceDatabase 函式,以取得資料庫的鎖定。 |
SC_MANAGER_MODIFY_BOOT_CONFIG (0x0020) | 呼叫 NotifyBootConfigStatus 函式的必要專案。 |
SC_MANAGER_QUERY_LOCK_STATUS (0x0010) | 需要呼叫 QueryServiceLockStatus 函式,才能擷取資料庫的鎖定狀態資訊。 |
以下是 SCM 的 一般存取權限 。
存取權限 | Description |
---|---|
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 控制碼。 只有具有系統管理員許可權的程式才能開啟 可供 CreateService 和 LockServiceDatabase 函式使用的 SCM 控制碼。
系統會建立 SCM 的安全性描述元。 若要取得或設定 SCM 的安全性描述元,請使用 QueryServiceObjectSecurity 和 SetServiceObjectSecurity 函式搭配 SCManager 物件的控制碼。
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 的安全性描述項執行安全性檢查,再授與要求的存取權限。
服務的存取權限
以下是服務的特定存取權限。
存取權限 | Description |
---|---|
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 函式以指定使用者定義控制項程式碼的必要專案。 |
以下是服務 的標準存取權限 。
存取權限 | Description |
---|---|
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函式,才能修改服務物件之安全性描述元的擁有者和群組成員。 |
以下是服務的 一般存取權限 。
存取權限 | Description |
---|---|
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 會建立服務物件的安全性描述元。 服務物件的預設安全性描述元會授與下列存取權。
帳戶 | 存取權限 |
---|---|
遠端驗證的使用者 | 預設不會授與。Windows Server 2003 SP1: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 存取權,服務就會從傳回給用戶端的服務清單中以無訊息方式省略。