スレッド セキュリティとアクセス権

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

CreateProcess、CreateProcessAsUserCreateProcessWithLogonWCreateThread、または CreateRemoteThread 関数を呼び出すときに、スレッドのセキュリティ記述子を指定できます。 NULL を指定すると、スレッドは既定のセキュリティ記述子を取得します。 スレッドの既定のセキュリティ記述子の ACL は、作成者のプライマリ トークンまたは偽装トークンから取得されます。

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

CreateThread 関数によって返されるハンドルは、スレッド オブジェクトにTHREAD_ALL_ACCESSアクセスできます。 GetCurrentThread 関数を呼び出すと、システムは、スレッドのセキュリティ記述子が呼び出し元に許可する最大アクセス権を持つ擬似ハンドルを返します。

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

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

 

次の表に、スレッド固有のアクセス権を示します。

説明
SYNCHRONIZE (0x00100000L) 待機関数のいずれかでスレッド ハンドルを使用できるようにします。
THREAD_ALL_ACCESS スレッド オブジェクトに対して可能なすべてのアクセス権。Windows Server 2003 および Windows XP: Windows Server 2008 および Windows Vista では 、THREAD_ALL_ACCESS フラグの値が増加しました。 Windows Server 2008 および Windows Vista 用にコンパイルされたアプリケーションが Windows Server 2003 または Windows XP で実行されている場合、 THREAD_ALL_ACCESS フラグにはサポートされていないアクセス ビットが含まれており、このフラグを指定する関数は ERROR_ACCESS_DENIEDで失敗します。 この問題を回避するには、操作に必要なアクセス権の最小セットを指定します。 THREAD_ALL_ACCESSを使用する必要がある場合は、アプリケーションの対象となる最小オペレーティング システム (例: #define _WIN32_WINNT _WIN32_WINNT_WINXP) に_WIN32_WINNTを設定します。 詳細については、「 Windows ヘッダーの使用」を参照してください。
THREAD_DIRECT_IMPERSONATION (0x0200) クライアントを偽装するサーバー スレッドに必要です。
THREAD_GET_CONTEXT (0x0008) GetThreadContext を使用してスレッドのコンテキストを読み取るために必要です。
THREAD_IMPERSONATE (0x0100) 偽装サービスを提供する通信メカニズムを使用して、スレッドのセキュリティ情報を呼び出さずに直接使用する必要があります。
THREAD_QUERY_INFORMATION (0x0040) 終了コードなど、スレッド オブジェクトから特定の情報を読み取るために必要です ( 「GetExitCodeThread」を参照)。
THREAD_QUERY_LIMITED_INFORMATION (0x0800) スレッド オブジェクトから特定の情報を読み取るために必要です ( 「GetProcessIdOfThread」を参照)。 THREAD_QUERY_INFORMATIONアクセス権を持つハンドルには、THREAD_QUERY_LIMITED_INFORMATIONが自動的に付与されますWindows Server 2003 および Windows XP:このアクセス権はサポートされていません。
THREAD_SET_CONTEXT (0x0010) SetThreadContext を使用してスレッドのコンテキストを記述するために必要です。
THREAD_SET_INFORMATION (0x0020) スレッド オブジェクトで特定の情報を設定するために必要です。
THREAD_SET_LIMITED_INFORMATION (0x0400) スレッド オブジェクトで特定の情報を設定するために必要です。 THREAD_SET_INFORMATIONアクセス権を持つハンドルには、THREAD_SET_LIMITED_INFORMATIONが自動的に付与されます。Windows Server 2003 および Windows XP:このアクセス権はサポートされていません。
THREAD_SET_THREAD_TOKEN (0x0080) SetThreadToken を使用してスレッドの偽装トークンを設定するために必要です。
THREAD_SUSPEND_RESUME (0x0002) スレッドを中断または再開するために必要です (「 SuspendThread 」および「 ResumeThread」を参照)。
THREAD_TERMINATE (0x0001) TerminateThread を使用してスレッドを終了するために必要です。

 

オブジェクトの SACL の読み取 または書き込みを行う場合は、スレッド オブジェクトへのACCESS_SYSTEM_SECURITYアクセス権を要求できます。 詳細については、「Access-Control Lists (ACL)」および「SACL Access Right」を参照してください。

保護されたプロセス

保護されたプロセスにより、 Digital Rights Management のサポートが強化されます。 システムは、保護されたプロセスと保護されたプロセスのスレッドへのアクセスを制限します。

Windows Server 2003 および Windows XP: 保護されたプロセスは、Windows Vista 以降に追加されました。

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

THREAD_ALL_ACCESS
THREAD_DIRECT_IMPERSONATION
THREAD_GET_CONTEXT
THREAD_IMPERSONATE
THREAD_QUERY_INFORMATION
THREAD_SET_CONTEXT
THREAD_SET_INFORMATION
THREAD_SET_TOKEN
THREAD_TERMINATE

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