服務安全性和訪問許可權
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 |
|
具有正確訪問許可權的程式可以開啟 SCM 的句柄,此句柄可用於 OpenService、EnumServicesStatusEx和 QueryServiceLockStatus 函式。 只有具有系統管理員許可權的程式能夠開啟 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 |
SCM 會在 CreateService 函式安裝服務時,建立服務對象的安全性描述元。 服務對象的預設安全性描述元會授與下列存取權。
帳戶 | 訪問許可權 |
---|---|
遠端驗證的使用者 | 預設不會授與。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 訪問許可權,服務就會從傳回至用戶端的服務清單中以無訊息方式省略。