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

Windows セキュリティ モデルを使用すると、サービス制御マネージャー (SCM) とサービス オブジェクトへのアクセスを制御できます。 次のセクションでは、詳細情報を提供します。

Service Control Manager のアクセス権

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、EnumServicesStatusExおよび QueryServiceLockStatus 関数で使用できる SCM へのハンドルを開くことができます。 CreateService 関数と LockServiceDatabase 関数で使用できる SCM へのハンドルを開くことができるのは、管理者特権を持つプロセスだけです。

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

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

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

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_CONNECTSC_MANAGER_ENUMERATE_SERVICESC_MANAGER_QUERY_LOCK_STATUSおよびSTANDARD_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_NAMEprivilege を有効にし、ACCESS_SYSTEM_SECURITY アクセスのハンドルを開き、特権を無効にすることです。
DELETE (0x10000) DeleteService 関数を呼び出してサービスを削除するために必要です。
READ_CONTROL (0x20000) QueryServiceObjectSecurity 関数を呼び出して、サービス オブジェクトのセキュリティ記述子を照会するために必要です。
WRITE_DAC (0x40000) SetServiceObjectSecurity 関数を呼び出して、サービス オブジェクトのセキュリティ記述子の Dacl メンバーを変更するために必要です。
WRITE_OWNER (0x80000) SetServiceObjectSecurity 関数を呼び出して、サービス オブジェクトのセキュリティ記述子の所有者メンバーとグループ メンバーを変更するために必要です。

サービスの 一般的なアクセス権 を次に示します。

アクセス権 説明
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

SCM は、 サービスが CreateService 関数によってインストールされるときに、サービス オブジェクトのセキュリティ記述子を作成します。 サービス オブジェクトの既定のセキュリティ記述子は、次のアクセス権を付与します。

Account アクセス権
リモートで認証されたユーザー 既定では付与されません。SP1 を使用したサーバー 2003 のWindows: 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 アクセス権を持っていない場合、サービスはクライアントに返されるサービスの一覧から暗黙的に省略されます。