サービスのセキュリティとアクセス権

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
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

正しいアクセス権を持つプロセスは、OpenService、EnumServicesStatusExQueryServiceLockStatus 関数で使用できる SCM へのハンドルを開くことができます。 CreateService 関数と LockServiceDatabase 関数で使用できる SCM へのハンドルを開くことができるのは、管理者特権を持つプロセスのみです。

システムは、SCM のセキュリティ記述子を作成します。 SCM のセキュリティ記述子を取得または設定するには、SCManager オブジェクトへのハンドルを持つ QueryServiceObjectSecurity 関数と SetServiceObjectSecurity 関数を使用します。

Windows Server 2003 および Windows XP: 他のほとんどのセキュリティ保護可能なオブジェクトとは異なり、SCM のセキュリティ記述子は変更できません。 この動作は、Windows Server 2003 Service Pack 1 (SP1) の時点で変更されています。

次のアクセス権が付与されます。

Account アクセス権が
リモートで認証されたユーザー
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_CONNECT、SC_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) サービス構成を変更するには、 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 SACL にアクセスするには、 QueryServiceObjectSecurity 関数または SetServiceObjectSecurity 関数を呼び出すために必要です。 このアクセスを取得する適切な方法は、呼び出し元の現在のアクセス トークンで SE_SECURITY_NAME特権 を有効にし、 ACCESS_SYSTEM_SECURITY アクセスのハンドルを開き、特権を無効にすることです。
DELETE (0x10000) DeleteService 関数を呼び出してサービスを削除するには必須です。
READ_CONTROL (0x20000) QueryServiceObjectSecurity 関数を呼び出して、サービス オブジェクトのセキュリティ記述子に対してクエリを実行するために必要です。
WRITE_DAC (0x40000) サービス オブジェクトのセキュリティ記述子の Dacl メンバーを変更するには、SetServiceObjectSecurity 関数を呼び出すために必要です。
WRITE_OWNER (0x80000) SetServiceObjectSecurity 関数を呼び出して、サービス オブジェクトのセキュリティ記述子の Owner メンバーと Group メンバーを変更するために必要です。

サービスの 汎用アクセス権 を次に示します。

アクセス権 説明
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 によってサービス オブジェクトのセキュリティ記述子が作成されます。 サービス オブジェクトの既定のセキュリティ記述子は、次のアクセス権を付与します。

Account アクセス権が
リモート認証ユーザー 既定では付与されません。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
管理者
DELETE
READ_CONTROL
SERVICE_ALL_ACCESS
WRITE_DAC
WRITE_OWNER

操作を実行するには、ユーザーが対話形式でログオンしているか、サービスがいずれかのサービス アカウントを使用する必要があります。

サービス オブジェクトのセキュリティ記述子を取得または設定するには、 QueryServiceObjectSecurity 関数と SetServiceObjectSecurity 関数を 使用します。 詳細については、「 サービスの DACL の変更」を参照してください。

プロセスで OpenService 関数を使用する場合、システムは、要求されたアクセス権をサービス オブジェクトのセキュリティ記述子に対してチェックします。

信頼されていないユーザー ( SERVICE_CHANGE_CONFIGSERVICE_STOPなど) に特定のアクセス権を付与すると、サービスの実行に干渉し、LocalSystem アカウントでアプリケーションを実行できる場合があります。

EnumServicesStatusEx 関数が呼び出されると、呼び出し元がサービスに対するSERVICE_QUERY_STATUSアクセス権を持っていない場合、クライアントに返されるサービスの一覧からサービスは自動的に省略されます。