セキュリティとアクセス権の処理

Microsoft Windows セキュリティ モデルを使用すると、プロセス オブジェクトへのアクセスを制御できます。 セキュリティの詳細については、「 アクセス制御モデル」を参照してください。

ユーザーがログインすると、システムは認証プロセス中にユーザーを一意に識別する一連のデータを収集し、 アクセス トークンに格納します。 このアクセス トークンは、ユーザーに関連付けられているすべてのプロセスのセキュリティ コンテキストを記述します。 プロセスのセキュリティ コンテキストは、プロセスまたはプロセスを作成したユーザー アカウントに指定された資格情報のセットです。

CreateProcessWithTokenW 関数を使用して、トークンを使用してプロセスの現在のセキュリティ コンテキストを指定できます。 CreateProcess、CreateProcessAsUser、または CreateProcessWithLogonW 関数を呼び出すときに、プロセスのセキュリティ記述子を指定できます。 NULL を指定すると、プロセスは既定のセキュリティ記述子を取得します。 プロセスの既定のセキュリティ記述子の ACL は、作成者のプライマリ トークンまたは偽装トークンから取得されます。

プロセスのセキュリティ記述子を取得するには、 GetSecurityInfo 関数を呼び出します。 プロセスのセキュリティ記述子を変更するには、 SetSecurityInfo 関数を呼び出します。

プロセス オブジェクトの有効なアクセス権には、 標準のアクセス権 と、プロセス固有のアクセス権が含まれます。 次の表に、すべてのオブジェクトで使用される標準アクセス権の一覧を示します。

説明
DELETE (0x00010000L) オブジェクトを削除するために必要です。
READ_CONTROL (0x00020000L) SACL 内の情報を含まない、オブジェクトのセキュリティ記述子の情報を読み取るために必要です。 SACL の読み取りまたは書き込みを行うには、 ACCESS_SYSTEM_SECURITY アクセス権を要求する必要があります。 詳細については、「 SACL アクセス権」を参照してください。
SYNCHRONIZE (0x00100000L) 同期にオブジェクトを使用する権限。 これにより、スレッドはオブジェクトがシグナル状態になるまで待機できます。
WRITE_DAC (0x00040000L) オブジェクトのセキュリティ記述子で DACL を変更するために必要です。
WRITE_OWNER (0x00080000L) オブジェクトのセキュリティ記述子の所有者を変更するために必要です。

 

次の表に、プロセス固有のアクセス権の一覧を示します。

説明
PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED (0x000F0000L) |SYNCHRONIZE (0x00100000L) |0xFFFF) プロセス オブジェクトに対して可能なすべてのアクセス権。Windows Server 2003 および Windows XP: Windows Server 2008 および Windows Vista では 、PROCESS_ALL_ACCESS フラグのサイズが大きくなりました。 Windows Server 2008 および Windows Vista 用にコンパイルされたアプリケーションが Windows Server 2003 または Windows XP で実行されている場合、 PROCESS_ALL_ACCESS フラグが大きすぎて、このフラグを指定する関数が ERROR_ACCESS_DENIEDで失敗します。 この問題を回避するには、操作に必要なアクセス権の最小セットを指定します。 PROCESS_ALL_ACCESSを使用する必要がある場合は、_WIN32_WINNTをアプリケーションの対象とする最小オペレーティング システム (例: #define _WIN32_WINNT _WIN32_WINNT_WINXP) に設定します。 詳細については、「 Windows ヘッダーの使用」を参照してください。
PROCESS_CREATE_PROCESS (0x0080) このプロセスを 、PROC_THREAD_ATTRIBUTE_PARENT_PROCESSの親プロセスとして使用するために必要です。
PROCESS_CREATE_THREAD (0x0002) プロセスでスレッドを作成するために必要です。
PROCESS_DUP_HANDLE (0x0040) DuplicateHandle を使用してハンドルを複製するために必要です。
PROCESS_QUERY_INFORMATION (0x0400) トークン、終了コード、優先度クラスなど、プロセスに関する特定の情報を取得するために必要です ( OpenProcessToken を参照)。
PROCESS_QUERY_LIMITED_INFORMATION (0x1000) プロセスに関する特定の情報を取得するために必要です ( 「GetExitCodeProcessGetPriorityClassIsProcessInJobQueryFullProcessImageName」を参照してください)。 PROCESS_QUERY_INFORMATIONアクセス権を持つハンドルには、PROCESS_QUERY_LIMITED_INFORMATIONが自動的に付与されますWindows Server 2003 および Windows XP:このアクセス権はサポートされていません。
PROCESS_SET_INFORMATION (0x0200) プロセスに関する特定の情報 (優先度クラスなど) を設定するために必要です ( SetPriorityClass を参照してください)。
PROCESS_SET_QUOTA (0x0100) SetProcessWorkingSetSize を使用してメモリ制限を設定するために必要です。
PROCESS_SUSPEND_RESUME (0x0800) プロセスを中断または再開するために必要です。
PROCESS_TERMINATE (0x0001) TerminateProcess を使用してプロセスを終了するために必要です。
PROCESS_VM_OPERATION (0x0008) プロセスのアドレス空間に対して操作を実行するために必要です ( 「VirtualProtectEx 」および「 WriteProcessMemory」を参照してください)。
PROCESS_VM_READ (0x0010) ReadProcessMemory を使用してプロセス内のメモリを読み取るために必要です。
PROCESS_VM_WRITE (0x0020) WriteProcessMemory を使用してプロセス内のメモリに 書き込むには必須です。
SYNCHRONIZE (0x00100000L) 待機関数を使用してプロセスが終了するまで 待機するために必要です。

 

別のプロセスへのハンドルを開き、完全なアクセス権を取得するには、 SeDebugPrivilege 特権を有効にする必要があります。 詳細については、「 トークンでの特権の変更」を参照してください。

CreateProcess 関数によって返されるハンドルは、プロセス オブジェクトにPROCESS_ALL_ACCESSアクセスできます。 OpenProcess 関数を呼び出すと、要求されたアクセス権がプロセスのセキュリティ記述子の DACL に対してチェックされます。 GetCurrentProcess 関数を呼び出すと、DACL が呼び出し元に許可する最大アクセス権を持つ擬似ハンドルが返されます。

オブジェクトの SACL の読み取 または書き込みを行う場合は、プロセス オブジェクトへのACCESS_SYSTEM_SECURITYアクセス権を要求できます。 詳細については、 アクセス制御リスト (ACL)SACL アクセス権に関するページを参照してください

警告

ここに示されているアクセス権の一部を持つプロセスでは、それらを使用して他のアクセス権を取得できます。 たとえば、プロセス A に PROCESS_DUP_HANDLE アクセス 権を持つプロセス B を処理するハンドルがある場合、プロセス B の擬似ハンドルを複製できます。これにより、プロセス B への最大アクセス権を持つハンドルが作成されます。擬似ハンドルの詳細については、「 GetCurrentProcess」を参照してください。

 

保護されたプロセス

Windows Vista では、Digital Rights Management のサポートを強化するための 保護されたプロセス が導入されています。 システムは、保護されたプロセスと保護されたプロセスのスレッドへのアクセスを制限します。

次の標準アクセス権は、プロセスから保護されたプロセスに対して許可されません。

  • DELETE
  • READ_CONTROL
  • WRITE_DAC
  • WRITE_OWNER

次の特定のアクセス権は、プロセスから保護されたプロセスに対して許可されません。

  • PROCESS_ALL_ACCESS
  • PROCESS_CREATE_PROCESS
  • PROCESS_CREATE_THREAD
  • PROCESS_DUP_HANDLE
  • PROCESS_QUERY_INFORMATION
  • PROCESS_SET_INFORMATION
  • PROCESS_SET_QUOTA
  • PROCESS_VM_OPERATION
  • PROCESS_VM_READ
  • PROCESS_VM_WRITE

PROCESS_QUERY_INFORMATIONを通じて利用可能な情報のサブセットへのアクセスを提供するために、PROCESS_QUERY_LIMITED_INFORMATION権限が導入されました。