名前付きパイプのセキュリティとアクセス権
Windows セキュリティを使用すると、名前付きパイプへのアクセスを制御できます。 セキュリティの詳細については、「 アクセス制御モデル」を参照してください。
CreateNamedPipe 関数を呼び出すときに、名前付きパイプのセキュリティ記述子を指定できます。 セキュリティ記述子は、名前付きパイプのクライアント側とサーバー側の両方へのアクセスを制御します。 NULL を指定すると、名前付きパイプは既定のセキュリティ記述子を取得します。 名前付きパイプの既定のセキュリティ記述子の ACL は、LocalSystem アカウント、管理者、作成者所有者にフル コントロールを付与します。 また、Everyone グループと匿名アカウントのメンバーに読み取りアクセス権を付与します。
名前付きパイプのセキュリティ記述子を取得するには、 GetSecurityInfo 関数を呼び出します。 名前付きパイプのセキュリティ記述子を変更するには、 SetSecurityInfo 関数を呼び出します。
スレッドが CreateNamedPipe を呼び出して既存の名前付きパイプのサーバー側のハンドルを開くと、システムはハンドルを返す前にアクセス チェックを実行します。 アクセス チェックは、スレッドのアクセス トークンと要求されたアクセス権を、名前付きパイプのセキュリティ記述子の DACL と比較します。 DACL は、要求されたアクセス権に加えて、呼び出し元のスレッドFILE_CREATE_PIPE_INSTANCE名前付きパイプへのアクセスを許可する必要があります。
同様に、クライアントが CreateFile または CallNamedPipe 関数を呼び出して名前付きパイプのクライアント側に接続すると、システムはクライアントへのアクセスを許可する前にアクセスチェックを実行します。
CreateNamedPipe 関数によって返されるハンドルには、常に SYNCHRONIZE アクセス権があります。 また、パイプの開いているモードに応じて、GENERIC_READ、GENERIC_WRITE、またはその両方も含まれます。 開いている各モードのアクセス権を次に示します。
オープン モード | アクセス権が |
---|---|
PIPE_ACCESS_DUPLEX (0x00000003) | FILE_GENERIC_READ、FILE_GENERIC_WRITE、SYNCHRONIZE |
PIPE_ACCESS_INBOUND (0x00000001) | FILE_GENERIC_READと同期 |
PIPE_ACCESS_OUTBOUND (0x00000002) | FILE_GENERIC_WRITEと同期 |
名前付きパイプのアクセスFILE_GENERIC_READ、パイプからデータを読み取る権限、パイプ属性を読み取る権限、拡張属性を読み取る権限、パイプの DACL を読み取る権限が組み合わされます。
名前付きパイプへのアクセスFILE_GENERIC_WRITE、パイプへのデータの書き込み、データの追加、パイプ属性の書き込み、拡張属性の書き込み、パイプの DACL の読み取りを行う権限が組み合わされます。 FILE_APPEND_DATAとFILE_CREATE_PIPE_INSTANCEには同じ定義があるため、FILE_GENERIC_WRITEはパイプを作成する権限を有効にします。 この問題を回避するには、FILE_GENERIC_WRITEを使用する代わりに個々の権限を使用します。
オブジェクトの SACL の読み取りまたは書き込みを行う場合は、名前付きパイプ オブジェクトへのACCESS_SYSTEM_SECURITYアクセス権を要求できます。 詳細については、 アクセス制御リスト (ACL) と SACL アクセス権に関するページを参照してください。
別のターミナル サービス セッションのリモート ユーザーまたはユーザーが名前付きパイプにアクセスできないようにするには、パイプの DACL でログオン SID を使用します。 ログオン SID は、実行時ログオンでも使用されます。これは、セッションごとのオブジェクト名前空間を保護するために使用される SID です。 詳細については、「 C++ でのログオン SID の取得」を参照してください。