この記事は翻訳者によって翻訳されたものです。 記事の文章にポインターを重ねると、原文のテキストが表示されます。
訳文
原文
1 人のうち 0 人が、- このトピックを評価する が役に立ったと評価しました

デジタル著作権管理 (DRM)

Silverlight

デジタル著作権管理 (DRM) を Silverlight アプリケーションに組み込むと、ストリーミング、プログレッシブ ダウンロード、レンタル、サブスクリプションなどのさまざまなシナリオで、プラットフォームに依存せずに、コンテンツの保護を強化し、より安全な配信を行うことができます。

メモ メモ :

このトピックは、Silverlight 4 および Silverlight 5 Beta のみを対象としています。 Silverlight 3 での DRM については、「デジタル著作権管理 (Silverlight 3)」を参照してください。

このトピックには次のセクションが含まれています。

DRM を使用すると、オーディオおよびビデオのコンテンツをより安全に配信し、未承認の取り込みや再配信からの保護を強化できます。 この保護機能は、次のようなさまざまなビジネス シナリオに組み込むことができます。

  • オンライン シナリオ: これらのシナリオでは、メディア コンテンツを再生している間、ユーザーがオンライン状態を維持する必要があります。

    • ライブ ストリーミング: ライブ ストリーミング (本来の意味でのストリーミング) では、コンテンツがコンピューターやデバイスに直接送信され、ファイルがハード ディスクに保存されることはありません。 ライブ ストリーミングは、ブロードキャストされている間だけ利用できます。 ライブ ストリーミングの例としては、インターネット テレビやラジオがあります。

    • プログレッシブ ダウンロード: プログレッシブ ダウンロードでは、ユーザーはメディアをダウンロードしながら再生できます。 ユーザーの視点から見たプログレッシブ ダウンロードとライブ ストリーミングの主な違いは、プログレッシブ ダウンロードでは少しずつダウンロードしたコンテンツが、一時的であれ、ユーザーのコンピューターまたはデバイスに保存されることです。

  • オフライン シナリオ: これらのシナリオでは、ユーザーはオフラインでもコンテンツを再生できます。 この場合は、ユーザーのコンピューターまたはデバイスにオフライン Silverlight ランタイムがインストールされている必要があります。また、コンテンツを初めてダウンロードしたり、サブスクリプションを更新したりするためには、ユーザーは断続的でもオンラインになる必要があります。

    • ダウンロード ファイル オフライン (1 回限りの購入): ユーザーはインターネットからコンテンツをダウンロードし、後でオフラインの Silverlight プレーヤーを使用して再生します。 たとえば、オンラインのビデオ店の場合、ユーザーは有料でビデオ ファイルをダウンロードし、そのファイルを好きなときにオフラインの Silverlight プレーヤーで再生できます。 DRM ソフトウェアでは、ビデオ ファイルの再配信を 1 つまたは複数のデバイスに制限できます (この後の「ドメイン」を参照してください)。

    • レンタル: DRM ライセンスの制限時間を指定して、コンテンツの再生を制限できます。 たとえば、オンラインのビデオ店でビデオのレンタルを行うとします。 レンタルを購入し、ライセンスをダウンロードすると、ライセンスの有効期限は、発行から 30 日後またはコンテンツを最初に再生してから 24 時間後のどちらか早い時点で切れます。

    • サブスクリプション: サブスクリプション モデルに基づいて、ユーザーがコンテンツを再生できるようにすることができます。 たとえば、オンラインのビデオ店で、ユーザーが月額料金を支払うことで、テレビ コンテンツを 100 時間までオンラインで視聴でき、最大で 20 タイトルをダウンロードできるとします。 サブスクリプション ライセンスは 45 日ごとに有効期限が切れるため、サブスクリプションを更新するには、月額料金を支払い、少なくとも月に 1 回はサービスに接続する必要があります。

次のセクションでは、Silverlight DRM のオンライン シナリオを実現する方法について説明します。 ここで紹介する概念の多くは、オフライン シナリオにも適用できます。ただし、レンタルやサブスクリプションなどのオフライン シナリオについては、この後の「Silverlight DRM のオフライン シナリオ」で説明します。

ここでは、Silverlight で DRM コンテンツを再生するために必要な最小限のコンポーネントについて説明します。 これらのコンポーネントはオンラインとオフラインの両方のシナリオに適用できます。ただし、シナリオによっては、後のセクションで説明する追加のコンポーネントが必要になります。

次の図に、Silverlight を使用して DRM コンテンツをオンラインで再生する場合に必要となるプロセスと、これらのプロセスを円滑にするために必要なクライアントとサーバーの対話を示します。 それぞれの手順については、後で詳しく説明します。

Silverlight DRM がどのように機能するかを概念的に示す。

メモ メモ :

コンテンツを再生するコンピューターに既にライセンスが与えられている場合は、ライセンス取得プロセスを再度実行する必要はなく、既存のライセンスを使用して再生できることがあります。

1.Silverlight クライアントによるコンテンツへのアクセス

配信サーバーに格納されている DRM で保護されたコンテンツをユーザーが Silverlight アプリケーションで再生しようとします (通常、コンテンツを配信するための配信サーバーには Web サーバーが使用されます)。 Silverlight クライアントが、コンテンツ (または、ストリーミングの場合はコンテンツの一部) とヘッダーをダウンロードします。

2.ユーザーのコンピューターは個別化されているか

Silverlight は、コンテンツの暗号化を解除するためのライセンスを要求する前に、ユーザーのコンピューターに適切な DRM ソフトウェアがインストールされているかどうかを確認する必要があります。 このソフトウェアは個別化ブラック ボックス (IBX) と呼ばれ、保護されたコンテンツを再生する前に必要となる DRM のクライアント コンポーネントです。 個別化コンポーネント ソフトウェアによって、クライアント コンピューターは DRM ライセンスを要求および使用できるようになります。 また、暗号化解除プロセスで使用される重要情報が保護されます。

適切な個別化コンポーネント ソフトウェアがクライアントにインストールされていない場合、クライアントは、Microsoft Individualization Service に対してコンポーネントを自動的に要求します。 個別化コンポーネント ソフトウェアを取得するプロセスは、個別化と呼ばれます。 Silverlight は、Microsoft Individualization Service に情報を送信してユーザーのコンピューターを個別化します。 ユーザーはこの情報の送信をブロックできます。 詳細については、この後の「エラー処理」を参照してください

通常、有効な個別化コンポーネントをインストールした後、クライアントは個別化を再度行う必要はありません。 ただし、サードパーティが実行する PlayReady ライセンス サーバー SDK によって、特定の IBX バージョンに対するライセンスの発行が拒否された場合は例外です。 拒否された場合は、クライアントによって更新が自動的に開始されます。

MediaElement.CurrentState プロパティを使用すると、コンピューターで最初に個別化が行われたときに検出できます。 詳細については、「DRM 状態の検出」を参照してください。

3.Silverlight によるライセンスの要求

有効な個別化コンポーネント ソフトウェアがクライアント上に存在する場合は、DRM を再生できる状態になっています。 ユーザーが初めて保護されているコンテンツの再生を開始すると、Silverlight クライアントは PlayReady ライセンス サーバーと通信を行ってライセンスを取得します (ライセンス サーバーは管理者またはサービス プロバイダーによって管理されます)。 要求を承認すると、ライセンス サーバーはライセンスを発行します。クライアントは、このライセンスを使用して、特定のメディア ファイルの暗号化を解除します。 その後、コンテンツを再生できるようになります。

4.クライアントはドメインに参加する必要があるか (オプション)

ユーザーが DRM で保護されたコンテンツを再生することができるコンピューターの管理を "ドメイン管理" と呼びます。 ドメイン管理は必須ではありませんが、オンラインとオフラインの両方のシナリオで役立つため、ここで説明しています。 Microsoft PlayReady ドメイン機能によって提供される機能は、エンド ユーザーが直感的に使用できます。そのため、サービス プロバイダーを使用することで、ユーザーはコンピューターのグループをドメインとして指定できます。

コンピューターにコンテンツのドメインバインド ライセンスが与えられている場合、そのドメインのすべてのコンピューターは、ドメイン内の他のコンピューターが取得した Microsoft PlayReady で保護されているコンテンツを利用できます。 ユーザーは、ドメイン内のコンピューターの合計台数がサービスによって定義されている制限を超えない限り、ドメインに対してコンピューターを簡単に追加または削除できます。 ドメイン管理は、用意した PlayReady ドメイン サーバー (ドメイン コントローラー サーバー) を使用して行います。 詳細については、この後の「ドメイン」を参照してください。

5.永続ライセンス ストアへのライセンスのコピー (オプション)

ライセンスを格納する機能は、Silverlight 4 リリースで追加されました。 ライセンス サーバーでは、"一度だけ使用できる" ライセンスとクライアント上で永続化されるライセンスのどちらを発行するかを選択できます。 クライアント上で永続化されるライセンスは、個別化時にクライアントに作成される永続ライセンス ストアに格納されます。 ユーザーのクライアント上へのライセンスの格納は、オフライン シナリオで特に役立ちます。 詳細については、「Silverlight DRM のオフライン シナリオ」を参照してください。

6.コンテンツの再生

コンテンツの再生に使用するライセンスが有効な場合は、再生が開始されます。

Silverlight クライアントでは、DRM で保護されたコンテンツに関して 2 種類の方式を使用できます。1 つは従来の Windows Media Digital Rights Management 10 (WMDRM 10)、もう 1 つは新しい PlayReady です。 この柔軟性により、WMDRM 10 SDK を使用して暗号化されている既存のコンテンツを Silverlight 内および DRM をサポートするその他の Windows メディア再生ソフトウェア (たとえば Windows Media Player) 内で再生できるほか、Silverlight のみのメディアでより高度なコンテンツ保護を提供できます。

メモ メモ :

WMDRM では、PlayReady とは異なるライセンスを使用します。 たとえば、ユーザーが DRM で保護された特定のビデオを Windows Media Player と Silverlight プレーヤーの両方で再生できるようにする場合は、ライセンスが 2 つ (再生手段ごとに 1 つ) 必要です。

メモ メモ :

PlayReady は Silverlight 以外でも使用されます。 PlayReady の詳細については、PlayReady のホワイト ペーパーを参照してください。

メモ メモ :

Silverlight は PlayReady と WMDRM でパッケージ化されたコンテンツを再生できますが、これらのテクノロジのエコシステム全体をサポートしているわけではありません。 加えて、WMDRM でパッケージ化されたコンテンツを Silverlight で再生するには、PlayReady サーバーが必要になります (前の図を参照してください)。

WMDRM のみを使用してコンテンツを暗号化する場合でも、ライセンスを Silverlight クライアントに配信するために少なくとも 1 つの PlayReady ライセンス サーバーが必要になります。 現在、Silverlight DRM では、PlayReady 機能の一部しかサポートされていないことにも注意してください。 Silverlight DRM の使用に関する重要な制限を次に示します。

  • Silverlight では、PlayReady でサポートされるすべてのファイルの種類がサポートされるわけではありません。 Silverlight では、DRM で暗号化された VC1、WMA、WMA Pro、h.264、および AAC の各ストリームの再生のみがサポートされています。

Silverlight で DRM を使用するためのアーキテクチャをセットアップする場合、次の考慮事項に留意してください。

  • コンテンツのストリーミングを行う場合、ライブ ソースからリアルタイムでエンコードとストリーミングを行うのか、またはあらかじめ暗号化したファイルをオンデマンドでストリーミングするのか。

  • コンテンツを再生するユーザーは Silverlight を使用しているのか、または Windows Media Player も使用しているのか。

  • WMDRM でパッケージ化されたコンテンツ (WMDRM SDK を使用してパッケージ化されたコンテンツ) の大量のライブラリがあり、これを Silverlight ユーザーに配信するのか、または PlayReady を使用してすべてのコンテンツをパッケージ化するのか。

  • PIFF 形式を使用する必要があるのか。 PIFF は、PlayReady を使用する場合にサポートされます。

これらの考慮事項に関係なく、DRM コンテンツを Silverlight に配信する場合は、少なくとも 1 つの PlayReady ライセンス サーバーを購入する必要があります。これらの質問は、PlayReady によるパッケージ化のみを使用するだけで済むのかどうか、または WMDRM でパッケージ化されたコンテンツを DRM ソリューション全体で処理する必要もあるのかどうかを判断する材料となります。

  • ストリーミング コンテンツ: PlayReady を使用してストリーミング コンテンツをライブ ソースからリアルタイムでエンコードする必要がある場合は、サードパーティのソリューションを使用できます。 また、このシナリオでは WMDRM を使用することもできます。 WMDRM と Silverlight を統合するソリューションについては、後述する「Silverlight での WMDRM コンテンツの再生」を参照してください。 アダプティブ ストリーミングをサポートするために Silverlight で使用される MediaStreamSource を使用する場合は、PlayReady でパッケージ化されたコンテンツを使用する必要があります。

  • クライアント プレーヤー: ユーザーが Silverlight のみを使用して DRM を再生する場合は、すべてのコンテンツを PlayReady を使用してパッケージ化できます。ただし、Windows Media Player クライアントも対象にしているユーザーには、WMDRM 暗号化が必要です。

  • コンテンツ ライブラリ: コンテンツを Silverlight でのみ再生するかどうかに関係なく、コンテンツを PlayReady を使用してパッケージ化することを避けるには、WMDRM でパッケージ化されたコンテンツを考慮した DRM ソリューションを作成する必要があります。

メモ メモ :

Silverlight では、スクリプト ストリームを含む WMDRM コンテンツをサポートしていません (スクリプト ストリームは、テキストにクローズド キャプショニングのようなストリームを提供します)。 スクリプト ストリームを含む WMDRM コンテンツを再生した場合、オーディオとビデオは通常どおりに再生されますが、スクリプト ストリームは無視されます。

次の図に、Silverlight クライアントで、非 Silverlight (レガシ WMDRM) クライアント向けの既存の WMDRM でパッケージ化されたコンテンツ ライブラリを使用する場合の概念を示します。

Silverlight DRM ダイアグラム。

ライブラリを含めるには、ライセンス要求を適切な PlayReady ライセンス サーバーにルーティングするロジックを Silverlight クライアントに組み込む必要があります (後述する「Silverlight アプリケーションからの DRM コンテンツの参照」を参照してください)。

ストリーミングまたはプログレッシブ ダウンロードの場合、DRM を Silverlight に統合するには、次の手順を実行する必要があります。

  1. DRM で保護されたコンテンツを配信するために必要なサーバー インフラストラクチャをセットアップします。

  2. MediaElement を使用して、Silverlight アプリケーションからこの保護されたコンテンツを参照します。

  3. 予想されるエラーを処理します (たとえば、ユーザーが DRM コンテンツを許可しないなど)。

  4. 必要に応じて、LicenseAcquirer クラスまたは DomainAcquirer クラスをサブクラス化してカスタム ビジネス ロジックを作成します。

メモ メモ :

WMDRM コンテンツの場合は、ライセンス取得時に適切な PlayReady ライセンス サーバーを参照するように URL をオーバーライドする必要があります。 これは、WMDRM コンテンツの WRMHeader に PlayReady ライセンス サーバーが含まれていないことが多いためです。

DRM を使用するには、最初に保護するコンテンツをパッケージ化し、クライアントが配信サーバーから利用できるようにする必要があります。 そのためには、パッケージ化ソフトウェアを使用します。 コンテンツをパッケージ化するためのオプションはいくつかあります。 そのうちの 2 つを次に示します。

  • WMDRM 10 SDK

  • PlayReady Server SDK

これらのテクノロジおよび関連するサーバー構成の詳細については、前の「PlayReady と WMDRM」を参照してください。

コンテンツを暗号化およびパッケージ化するときは、ライセンス取得 URL (LAURL: License Acquisition URL) を指定します。 ライセンス チャレンジをライセンス サーバーに送信する前に、Silverlight アプリケーション内でこの値をオーバーライドできます。 この機能は、WMDRM でパッケージ化されたコンテンツのライブラリが 1 つあり、そのコンテンツを Silverlight クライアントと Windows Media Player クライアントの両方に配信する場合に特に便利です (前の「Silverlight での WMDRM コンテンツの再生」および次の「Silverlight アプリケーションからの DRM コンテンツの参照」を参照してください)。

エンコードされたコンテンツを PlayReady サーバーのみを使用して暗号化するには、MediaElementSource プロパティを使用して目的のコンテンツを参照します。

<MediaElement x:Name="myMediaElement" Source="myProtectedVideo.wmv" />

PlayReady Server SDK を使用してパッケージ化されたコンテンツの場合、そのコンテンツ ヘッダーにライセンス サーバーの URI 位置が含まれているので、このような操作が可能です。 ただし、WMRM SDK を使用してコンテンツをパッケージ化した場合は、ライセンス サーバーの位置がヘッダーに含まれないので、この URI を指定する必要があります。 そのためには、LicenseServerUriOverride プロパティを使用して、ライセンスを取得するための MediaElementLicenseAcquirer プロパティの URI を指定します。

myMediaElement.LicenseAcquirer.LicenseServerUriOverride = 
    new Uri("http://contoso.com/myLicenseServer.asmx", UriKind.Absolute);

MediaElementState 列挙型を使用すると、MediaElement の状態、具体的には MediaElement が現在 Silverlight クライアントを個別化しているかまたはライセンスを取得しているかを検出できます (前の「オンラインでの Silverlight DRM の概念の概要」を参照してください)。 これらの状態を検出する 1 つの理由として、MediaElement がコンテンツの再生準備を行っているときに、その状況をユーザーにフィードバックできるようにすることがあります。 たとえば、次の例に示すように、TextBlock を使用して、個別化やライセンス要求が行われたときに、そのことをユーザーに通知できます。

if (myMediaElement.CurrentState == MediaElementState.Individualizing)
{
    myStateTextBlock.text = "Downloading DRM Client";
}
else if(myMediaElement.CurrentState == MediaElementState.AcquiringLicense)
{
    myStateTextBlock.text = "Aquiring License";
}

Silverlight で DRM を使用しているときに、ユーザーはさまざまなエラーを受け取ることがあります。 開発者にとっては、これらのエラーを予測し、期待どおりに再生が行われない理由をユーザーが理解できるように、適切なメッセージが表示されるようにすることが重要です。

たとえば、Silverlight の構成ダイアログ ボックスを開き、次の図に示したチェック ボックスをオフにして DRM を無効にした場合、ユーザーは DRM 固有のエラーを受け取ることがあります。

DRM 用 Silverlight の構成

DRM を無効にすると、ユーザーのクライアントは Microsoft 個別化サーバーからの個別化を要求できません (前の「オンラインでの Silverlight DRM の概念の概要」を参照してください)。

このシナリオにおいて MediaElement が DRM コンテンツを再生しようとした場合、MediaElement は、新しい MediaFailed イベントをエラー 6008 DRM_E_INDIVIDUALIZATION_DISALLOWED と共に生成します。

このエラーをリッスンし、エラーの発生時にカスタム メッセージを出力できます。

DRM に関連するその他のエラー

次の表に、Silverlight DRM に関連するエラーの一覧を示します。 以下のエラー番号は、6000 からの連番になっています。 エラー処理は、一覧に示されている MediaElementMediaFailed イベントを使用して行われます。また、同期メソッドおよびプロパティが例外を直接スローすることや、非同期メソッドが対応する AsyncCompletedEventArgs を通じて例外を返すことがあります。

エラー コード

メモ

6000

MediaElement が、DRM で保護されたコンテンツの再生に失敗しました。

6001

個別化コンポーネント ソフトウェアをユーザーのコンピューターにダウンロードできませんでした。 このエラーは、MediaElementIndividualizingMediaElementState のときに発生します。 このエラーの原因として、Silverlight クライアントが Microsoft 個別化サーバーに接続できない可能性があります。

6002

ライセンスの取得に失敗しました。 このエラーは、MediaElementAcquiringLicenseMediaElementState のときに発生します。 このエラーの原因として、Silverlight クライアントがライセンス サーバーに接続できない可能性があります。

6003

個別化コンポーネント ソフトウェアのインストールに失敗しました。

6004

クライアント上にインストールされている Silverlight は最新版ではないので更新する必要があります。

6005

ファイル ヘッダーの処理に失敗しました。 たとえば、ヘッダーの形式が正しくない可能性があります。

6006

Silverlight クライアント上でのライセンスの処理が失敗しました。 このエラーは、MediaElementAcquiringLicense MediaElementState のときに発生します。

6007

PlayReady ライセンス サーバーでは、サーバー開発者がサービスに固有のエラーを返すことができます。 たとえば、"料金を支払ってください"、"サービスをご利用いただけません"、"今月のストリーム カウントに達しました" などのエラーを返すことができます。 ライセンス サーバーから返される SOAP 例外は、サーバーによって追加される CustomData フィールドに追加データがあります。 したがって、これを解釈するためのアプリケーション ロジックを Silverlight アプリケーションに組み込む必要があります。 これらの応答は、主にカスタム ライセンス取得を実装するときに使用されます (後の「カスタム ロジックの追加」を参照してください)。

6008

ユーザーがクライアントの Silverlight 構成設定で DRM を無効にしました。

6009

個別化の試行回数が上限を超えました。

6010

DRM プロトコル エラーが発生しました。

6011

DRM ライセンス取得 URL のオーバーライドが必要です。

6012

DRM ライセンス取得のリダイレクト エラーが発生しました。

6013

ユーザーのハードウェア構成が大幅に変更され、DRM の状態が有効でなくなりました。

6017

ユーザーがストリームを使用して (AcquireLicenseAsync を呼び出して) ライセンスを取得しようとしましたが、そのストリームが保護されていないコンテンツに含まれています。

6021

DRM システムは、クライアント OS をサポートしていません。

6023

IBX サービスにアクセスできません。 いくつかのマルウェア/スパイウェアは *. microsoft.com の呼び出しをブロックするため、マシンに完全にパッチを適用し、保護してください。

6030

ライセンスにサポートされていないライセンス保護が含まれています。

6031

セキュリティで保護されたビデオ出力接続の整合性が、侵害されているか失われています。

6032

このセキュリティで保護されたグラフィックス接続には再ネゴシエートが必要ですが、再ネゴシエートできませんでした。

6033

失効した高帯域幅デジタル コンテンツ保護 (HDCP) デバイスが、ビデオ出力に接続されています。

6034

グラフィックス アダプターまたはドライバーが改ざんされています。

6035

新しいグラフィックス接続が再生中に追加されたため、再生が中止されました。

6036

グラフィックス デバイスのドライバー証明書が無効です。

6040

ドメインがいっぱいで、ユーザーはこのドメインにこれ以上クライアントを追加できません。

6041

クライアントがドメイン メンバーではありません。

6042

ドメイン アカウント識別子が不明です。

6208

DRM 初期化に失敗しました - Silverlight のアンインストール/再インストールの問題に対処する必要があります。

メモ メモ :

独自のカスタム ライセンス取得を実装する場合は、msprdrm_server_redirect_compat:falsemsprdrm_server_exception_compat:false のヘッダーを HTTP Web 要求に追加する必要があります。 これらのヘッダーを追加しないと、エラーおよびリダイレクト メッセージが適切に動作しません。 「カスタム ロジックの追加」セクションのコード例を参照してください。

メモ メモ :

同じ LicenseAcquirer または DomainAcquirer で複数の非同期操作を開始すると、InvalidOperationException がスローされます。

LicenseAcquirer クラスは、PlayReady ライセンス サーバーからの DRM で暗号化されたコンテンツのライセンスの取得を処理するために MediaElement によって使用されます。 LicenseAcquirer クラスをサブクラス化し、ライセンス要求に独自のカスタム認証方式を追加するなどのカスタム ロジックを追加することができます。

次の例では、("ManualLicenseAcquirer" という名前の) LicenseAcquirer クラスをオーバーライドして、ライセンスを取得するために MediaElement で使用する方法を示しています。

<StackPanel x:Name="LayoutRoot" Background="Gray" Orientation="Vertical">
   <MediaElement x:Name="myME" Height="100"/>
</StackPanel>
public partial class Page : UserControl
{

    public Page()
    {
      InitializeComponent();
      this.Loaded += new RoutedEventHandler(Page_Loaded);
    }

    void Page_Loaded(object sender, RoutedEventArgs e)
    {
      // Test a full fledged manual acquirer

      // Set the LicenseAcquirer of the MediaElement to the custom License Acquirer
      // defined in this sample.
      myME.LicenseAcquirer = new ManualLicenseAcquirer(myME.Name);

      // Set the License URI to proper License Server address.
      myME.LicenseAcquirer.LicenseServerUriOverride = new Uri("http://contoso.com/myLicenseServer.asmx", UriKind.Absolute);
      myME.MediaFailed += new EventHandler<ExceptionRoutedEventArgs>(myME_MediaFailed);

      // Set the source of the MediaElement to the URL of the media encrypted with WMDRM.
      myME.Source = new Uri("http://contoso.com/wmdrm_url.wmv", UriKind.Absolute);
    }

    void myME_MediaFailed(object sender, ExceptionRoutedEventArgs e)
    {
      string errorMessage = "";
      if (e.ErrorException.ToString().Contains(" 6001 "))
      {
          errorMessage = "The individualization component software failed to" +
                         " download to the user’s computer. This error would" +
                         " come up when the MediaElement is in the Individualizing" +
                         " MediaElementState. One possible reason for this error is" +
                         " that the Silverlight client cannot connect the Microsoft" +
                         " Individualization Server.";
      }
      else if (e.ErrorException.ToString().Contains(" 6004 "))
      {
          errorMessage = " The installation of Silverlight on the client is" +
                         " out of date and needs to be updated.";  
      }
      else
      {
          errorMessage = "MediaFailed: " + e.ErrorException.Message + ".";
      }
      System.Windows.Browser.HtmlPage.Window.Alert(errorMessage);
    }

    // makes license request explicitly
    public class ManualLicenseAcquirer : LicenseAcquirer
    {
      private string challengeString;
      string _mediaElementName;

    public ManualLicenseAcquirer(string mediaElementName)
    {
      _mediaElementName = mediaElementName;
    }

    // The default implementation of OnAcquireLicense calls into the MediaElement to acquire a
    //  license. It is called when the Media pipeline is building a topology and will be raised
    // before MediaOpened is raised.
    protected override void OnAcquireLicense(System.IO.Stream licenseChallenge, Uri licenseServerUri)
    {
      StreamReader sr = new StreamReader(licenseChallenge);
      challengeString = sr.ReadToEnd();

      // Need to resolve the URI for the License Server -- make sure it is correct
      // and store that correct URI as resolvedLicenseServerUri.
      Uri resolvedLicenseServerUri;
      if (LicenseServerUriOverride == null)
        resolvedLicenseServerUri = licenseServerUri;
      else
      resolvedLicenseServerUri = LicenseServerUriOverride;

      // Make a HttpWebRequest to the License Server.
      HttpWebRequest request = WebRequest.Create(resolvedLicenseServerUri) as HttpWebRequest;
      request.Method = "POST";

      // Set ContentType through property    
      request.ContentType = "application/xml";

      //  ADD REQUIRED HEADERS.
      // The headers below are necessary so that error handling and redirects are handled 
      // properly via the Silverlight client.
      request.Headers["msprdrm_server_redirect_compat"] = "false";
      request.Headers["msprdrm_server_exception_compat"] = "false";

      //  Initiate getting request stream  
      IAsyncResult asyncResult = request.BeginGetRequestStream(new AsyncCallback(RequestStreamCallback), request);
    }

    // This method is called when the asynchronous operation completes.
    void RequestStreamCallback(IAsyncResult ar)
    {
      HttpWebRequest request = ar.AsyncState as HttpWebRequest;

      // populate request stream  
      request.ContentType = "text/xml";
      Stream requestStream = request.EndGetRequestStream(ar);
      StreamWriter streamWriter = new StreamWriter(requestStream, System.Text.Encoding.UTF8);

      streamWriter.Write(challengeString);
      streamWriter.Close();

      // Make async call for response  
      request.BeginGetResponse(new AsyncCallback(ResponseCallback), request);
    }

    private void ResponseCallback(IAsyncResult ar)
    {
      HttpWebRequest request = ar.AsyncState as HttpWebRequest;
      WebResponse response = request.EndGetResponse(ar);
      SetLicenseResponse(response.GetResponseStream());
    }
  }
}

現在、一部のユーザーは、インターネットを経由した高品質なビデオの視聴に使用できる帯域幅を持っていません。 しかし、コンテンツを後で視聴するためにダウンロードできる高速な接続は持っています。 また、動画をダウンロードした後、インターネット接続がない飛行機や友人宅など、ネットワークが使用できない状況で視聴するユーザーもいるでしょう。 メディアの購入、サブスクリプション、レンタルなど、コンテンツ公開ビジネスのさまざまなシナリオを実現にするためには、オフラインのコンテンツでも強固に保護できるデジタル著作権管理 (DRM) を行うことが重要です。

おそらく最も簡単なオフライン シナリオは、ユーザーが 1 つのコンテンツを購入し、コンピューターにダウンロードして、好きなときに再生する場合です。

ユーザーは保護されているコンテンツをオフラインで再生しようとするため、ライセンスの検証もオフラインで行われる必要があります。 そのために、ダウンロードされたコンテンツに必要なライセンスは、初期化時にユーザーのコンピューター上に作成される永続ライセンス ストアと呼ばれる場所に保存されます (前の「オンラインでの Silverlight DRM の概念の概要」を参照してください)。 ユーザーがオフライン コンテンツを再生しようとすると、コンテンツは永続ライセンス ストア内で対応するライセンスを検索して再生を検証します。 これらのライセンスの反復処理の詳細については、「ライセンスの反復処理」セクションを参照してください。

オフライン シナリオでは、ユーザーは再生する前にコンテンツ ファイルをダウンロードします。 メディア ファイルのダウンロードには時間と帯域幅が必要なことがあるため、ユーザーが再生するときに検証するのではなく、ダウンロードを許可する前にユーザーのライセンスを検証することを検討してください。 その方法を次の例に示します。

次のアプリケーションでは、キー識別子と認証トークンを使用して、ライセンス取得要求をライセンス サーバーに送信します。 ライセンス サーバーはライセンスとコンテンツのダウンロード元の URL を返します。

// Called when the user is online and wants to download some protected content.
public void GetLicensePreDelivery(string customData,
                                     Guid keyId)
{
    Uri licenseServerUrl = new Uri("http://contoso.com/myLicenseServer.asmx");
    LicenseAcquirer acquirer = new LicenseAcquirer();
    acquirer.ChallengeCustomData = customData;

    // Set the License URI to proper License Server address.
    acquirer.LicenseServerUriOverride = licenseServerUrl;
    acquirer.AcquireLicenseCompleted += new EventHandler<AcquireLicenseCompletedEventArgs>(acquirer_Completed);
    acquirer.AcquireLicenseAsync(keyId, ContentKeyType.Aes128Bit, Guid.Empty);
}

AcquireLicenseAsync の呼び出しは、長いコンテンツ ダウンロード操作の完了を待たずに、ライセンスの取得を開始した後に完了します。 ライセンスの取得が実際に完了すると、AcquireLicenseCompleted イベントで構成されているデリゲートが呼び出されます。 この例では、それが acquirer_Completed メソッドであり、次の例のようになります。

public void acquirer_Completed(object sender, AcquireLicenseCompletedEventArgs e)
{
    if (e.Error != null)
    {
        // take appropriate action.  Might be retrying for instance.
    }
    else if (e.Cancelled)
    {
        // take appropriate action.  Might be nothing.
    }
    else
    {
        //
        //  We acquired the license successfully, go ahead and download
        //  the content.  Note the service decided to stash the content 
        //  url in the LicenseAcquirer response custom data.
        //
        string contentAcquisitionUrl = e.ResponseCustomData;
        DownloadContent(contentAcquisitionUrl);
    }
}

Microsoft PlayReady ドメイン機能によって提供される機能は、エンド ユーザーが直感的に使用できます。そのため、サービス プロバイダーを使用することで、ユーザーはコンピューターのグループをドメインとして指定できます。 コンピューターにコンテンツのドメインバインド ライセンスが与えられている場合、そのドメインのすべてのコンピューターは、ドメイン内の他のコンピューターが取得した Microsoft PlayReady で保護されているコンテンツを利用できます。 ユーザーは、ドメイン内のコンピューターの合計台数がサービスによって定義されている制限を超えない限り、ドメインに対してコンピューターを簡単に追加または削除できます。

次の図で、ドメイン管理がどのように DRM プロセス全体に組み込まれるかを概念的に示します。

Silverlight DRM がどのように機能するかを概念的に示す。

PlayReady ドメイン サーバー (ドメイン コントローラー) は、ドメインが表す対象 (ユーザー、家族、ユーザーのグループなど) の決定に使用されるサーバーで、ドメインに関連付けられているエンティティの一覧を保持します。 また、ドメイン サーバーは、ドメインに参加できるコンピューターの台数を定義するポリシーを適用します。 この場合も、パフォーマンス要件に応じて、ドメイン制御、配布、およびライセンス処理をすべて別々のサーバーで行うことも、同じサーバーで行うこともできます。 前の図では、わかりやすくするために、これらの処理を別々のサーバーで行っています。

ドメイン バインド ライセンスを使用する多くのメディア アプリケーションでは、アプリケーションの初回実行時に、クライアントがユーザーのドメインに参加する必要があります。 これにより、サービスはメディア コンテンツにアクセスできるユーザーあたりのクライアントの数を制御できます。 Silverlight API を使用してドメインを列挙することはできません。 そのため、クライアントがドメインに参加しているかどうかを確認するには、状態データ自体をアプリケーションで保持する必要があります。

次の簡単な例では、DomainAcquirer クラスを使用して、アプリケーションの最初の起動時に、ドメイン参加要求を実装する方法を示します。

Guid c_ServiceId = new Guid("{deb47f00-8a3b-416d-9b1e-5d55fd023044}");
Uri c_DomainServerUrl = new Uri("http://domainserver.contoso.com/rmsdk/rightsmanager.asmx");
Uri c_LicenseServerUrl = new Uri("http://licenseserver.contaso.com/rmsdk/rightsmanager.asmx");

public void acquirer_JoinDomainCompleted(object sender, DomainOperationCompletedEventArgs e)
{
    if (e.Error != null)
    {
        // Standard error handling may include logging the error, 
        // retrying, or reporting failure to the user
        // e.CustomData may have additional information depending on 
        // the type of error is reported in e.Message    
    }
    else if (e.Cancelled)
    {
        // Standard cancellation handling
    }
    else
    {
        // Update the ISO store that we are joined to the domain
        // The application may want to store e.AccountId
    }
}

public void JoinDomainOnFirstUse()
{
    if (false == IsJoinedToDomain())
    {
        string friendlyName = PromptUserForClientFriendlyName();
        DomainAcquirer acquirer = new DomainAcquirer();
        acquirer.JoinDomainCompleted +=new 
            EventHandler<JoinDomainCompletedEventArgs>(
            acquirer_JoinDomainCompleted);

        acquirer.JoinDomainAsync(c_ServiceId, 
                                 Guid.Empty, 
                                 c_DomainServerUrl,
                                 friendlyName);
    }
}

ユーザーにアカウントのプロパティ ページへのアクセスを許可することで、クライアントの登録を解除する機能を提供できます。 たとえば、現在ドメイン上にある各デバイス用の "このクライアントの登録解除" ボタンと、他のデバイスがドメインに参加するための "新しいクライアントの追加" ボタンを提供できます。 ユーザーが現在のクライアントの登録を解除すると、ドメイン離脱操作が実行されて、クライアントの永続ライセンス ストアからドメイン キーが削除されます。 このようにして、管理者は制御されたコンテンツを再生できるクライアントの数を制御し、ユーザーは登録するクライアントを制御します。

しかし、あるクライアント (クライアント y) のオンライン アカウントのプロパティ ページへのアクセス中に、ユーザーが別のクライアント (クライアント x) をドメインから削除した場合はどうなるのでしょうか。 クライアント x はドメインからの削除時にインターネットから切断されるため、クライアント x の永続ライセンス ストア内のドメイン ライセンスには削除の通知が行われず、クライアント x では引き続きコンテンツを再生できます。

多くのサービスには、このような登録解除を規制する厳密なビジネス ルールがあります。 たとえば、この方法で登録解除できるデバイスの数を制限する、解除登録を行うにはカスタマー サービスへの連絡を必要とする、不正行為の検出ロジックを適用するなどのルールがあります。 そのため、クライアントをドメインから削除する方法としてドメイン離脱の実行をお勧めします。 次の例では、"このクライアントの登録解除" ボタンを実装するためのロジックを示します。

public void RemoveClientFromAccountButton_OnClick(object sender,
                                                  RoutedEventArgs e)
{
    //
    // The service may want to prompt the user with a "Are you sure?"
    // prompt before removing the client as it will disable media 
    // playback of any domain bound content.
    // 
    // The service will want to look up the currently logged in user’s 
    // account identifier from the ISO store.  The accountId parameter
    // is strictly required, and it is the responsibility of the
    // service to ensure that is is available at this point.
    //
    Guid m_AccountId = accountId;

    DomainAcquirer acquirer = new myDomainAcquirer();

    acquirer.LeaveDomainCompleted += new
        EventHandler<LeaveDomainCompletedEventArgs>(
        acquirer_LeaveDomainCompleted);

    acquirer.LeaveDomainAsync(c_ServiceId,
                              m_AccountId,
                              c_DomainServerUrl);
}

public void acquirer_LeaveDomainCompleted(object sender, DomainOperationCompletedEventArgs e)
{
    if (e.Error != null)
    {
        // Error handling may include logging the error, retrying, or 
        // reporting failure to the user e.CustomData may have 
        // additional information depending on the type of error is 
        // reported in e.Message
    }
    else if (e.Cancelled)
    {
        // Handle cancel
    }
    else
    {
        // Update the ISO store that we left the domain.  Likely means 
        // cleaning up the domain object for the given AccountId.
    }
}

メモ    LeaveDomainAsync は失敗する可能性がありますが (クライアントがインターネットに接続していないなどの理由で)、クライアントはドメインから削除されます。 この場合、クライアントはドメインに属していないと見なしますが、サービスはクライアントがドメインに属していると見なす可能性があります。 サービスは、この不一致を調整する方法を提供する必要があります。

MediaElement を通じて取得したか、LicenseAcquirer を直接使用して取得したかに関係なく、ライセンス取得コードでは、ライセンス サーバーから送信される RenewDomainException エラーおよび DomainRequiredException エラー (前の「エラー処理」を参照) を認識します。 クライアントはいずれかのエラーを受け取ると、DomainAcquirer (既定のインスタンスまたはユーザーが構成したインスタンス) を使用して、ドメイン エラー メッセージで指定されたパラメーターでドメイン参加操作を実行しようとします。 次の例のロジックでは、この機能を利用する際に、API レベルでの実行が必要な操作がほとんどないことを示しています。

public void RenewDomain()
{

    LicenseAcquirer myLicenseAcquirer = new LicenseAcquirer();
    myLicenseAcquirer.DomainAcquirer = new myDomainAcquirer();

    mediaElement.LicenseAcquirer = myLicenseAcquirer;
    mediaElement.LicenseAcquirer.LicenseServerUriOverride =
        c_LicenseServerUrl;
    mediaElement.Source = new
        Uri("http://contoso.com/content.wmv");


    //
    //  If the license server decides that the client does not have a 
    //  domain membership, the domain membership is out of date, 
    //  then a DomainRequiredException or RenewDomainException respectively 
    //  will be thrown and the client will send back a response containing
    //  the necessary information (url, serviceid, accountid, etc) to 
    //  send to the domain server.  The license acquisition pipeline 
    //  would treat this somewhat like an Indiv message in that
    //  it would do the join domain and then restart the license 
    //  acquisition.
    //
    //  Note that a customized DomainAcquirer was provided so the 
    //  OnJoinDomain method will be called to allow 
    //  authentication information to be provided with the Join Domain 
    //  request.
    //
    mediaElement.Play();
}

レンタル、サブスクリプション、またはその両方を実現するのは、より複雑な LicenseServer ロジックを構築してライセンスを管理する必要があるため、単純なコンテンツの購入よりも複雑です。 たとえば、ユーザーがレンタルしたコンテンツをダウンロードする場合、ライセンスの有効期限および条件をライセンスで指定する必要があります。 その場合、ライセンスの有効期限が、コンテンツを最初に再生してから 24 時間後またはダウンロードしてから 30 日後のどちらか早い時点で切れるようにできます。

レンタル契約およびサブスクリプション契約は、ユーザーの永続ライセンス ストアにあるライセンスに保存されます。 コンテンツを再生するには、永続ライセンス ストアに適切なライセンスが存在し、有効であることが必要です。 ライセンスを反復処理する方法について説明する前に、さまざなライセンスの種類、および特定のシナリオを実現するためにライセンスをチェーンする方法について説明します。

ライセンスとは、資産 (別のライセンスまたは 1 つのコンテンツ) の復号化キーを保持するデータ ファイルです。 ライセンスには、アクセス権を与える資産の使用方法を定義する DRM 権利と制限も含まれます。 ライセンスには次の 3 種類があります。

  • シンプル ライセンス: PlayReady Server SDK を使用して作成されたアプリケーションから配信される、関連付けられているコンテンツのキーと共に権利と制限を含む PlayReady ライセンスです。

  • ルート ライセンス: 1 つ以上のリーフ ライセンスを制御するライセンスです。 リーフ ライセンスでは特定のコンテンツの再生を制御するのに対し、ルート ライセンスではすべてのリーフ ライセンスを制御します。 たとえば、サブスクリプション モデルでは、ルート ライセンスには有効期限がありますが、リーフ ライセンスにはありません。 ルート ライセンスの有効期限が切れると、新しいルート ライセンスを取得するまで、リーフ ライセンスは使用できません。

  • リーフ ライセンス: ルート ライセンスに依存するシンプル ライセンスです。

単一のルート ライセンスによって制御されるリーフ ライセンスが複数ある場合、これらのライセンスは "チェーンされた" ライセンスと呼ばれます。 次の図は、このしくみを概念的に表した図です。

ルートおよびリーフ ライセンスを示す。

たとえば、ユーザーがサブスクリプションを持っており、後でオフラインで再生するためにいくつかビデオをダウンロードしたとします。 ビデオごとに、そのビデオの許可された使用方法を指定するリーフ ライセンスがあります。 この例では、リーフ ライセンスに、ユーザーはビデオをいつでも再生できると定義されているとします。 ただし、再生を許可する前に PlayReady により有効なルート ライセンスがあることが確認されます。 ルート ライセンスの有効期限が切れている場合 (サブスクリプションの有効期限が切れた場合など)、そのリーフ ライセンスでは再生は許可されません。 このようにルート ライセンスを使用することで、サブスクリプション全体 (ユーザーのデバイス上にあるすべてのリーフ ライセンス) を制御できます。

メモ メモ :

1 つのリーフ ライセンスに対して、複数のルート ライセンスを指定できます。 その場合、再生するには少なくとも 1 つのルート ライセンスが有効であることが必要です。 また、ルート ライセンスがなくても、リーフ ライセンスは存在できます。

永続ライセンス ストアのすべてのライセンス (MediaLicense オブジェクト) を反復処理して、ライセンスまたはライセンス チェーンの有効期限が切れているかどうかを確認できます。 ライセンスを更新する必要がある場合は、ライセンス サーバーに接続して必要な変更を加える、ユーザーに支払を求めるなどのロジックを追加できます。

次の例では、サブスクリプションのライセンスを更新する必要があるかどうかを確認する方法を示します。 ライセンスを反復処理するには、ユーザーが管理者特権での信頼で Silverlight をブラウザー外で実行している必要があります。

private void CheckSubscriptionRootForRenewal(Guid parentKeyId,
                                             Uri licenseServerUrl)
{

    DateTimeOffset renewalDate = DateTimeOffset.Now.AddDays(5);

    // Query the licensemanager to see if we have a usable root license
    IEnumerable<MediaLicense> myLicenses = LicenseManagement.SelectLicenses(parentKeyId);

    bool renewRoot = true;

    foreach (MediaLicense ML in myLicenses)
    {
        // If the license expires within the next 5 days,
        // renew the subscribtion by requesting a new root license.
        if ((ML.Usable) &&
            (ML.ExpirationDate > renewalDate))
        {
            renewRoot = false;
            break;
        }

    }

    if (renewRoot)
    {
        LicenseAcquirer acquirer = new LicenseAcquirer();
        acquirer.LicenseServerUriOverride = licenseServerUrl;
        acquirer.AcquireLicenseCompleted += new EventHandler<AcquireLicenseCompletedEventArgs>(acquirer_Completed);
        acquirer.AcquireLicenseAsync(parentKeyId, ContentKeyType.Aes128Bit, Guid.Empty);
    }

この例では、永続ライセンス ストア内のすべての MediaLicense インスタンスを反復処理します。 MediaLicense インスタンスは、次のいずれかの値になります。

  • ライセンス チェーン (リーフとルート)

  • 単一のシンプル ライセンス

  • 単一のリーフ ライセンス (ルートが存在しない)

  • 単一のルート ライセンス (ルートを直接照会する)

次の関数を使用すると、特にユーザーがオフラインになっており、新しいライセンスを取得できない場合に、コンテンツの一覧をフィルター処理して、再生できる選択肢の一覧をユーザーに表示できます。 また、オフラインになる前にライセンスを取得するかどうかを決定するのにも使用できます。 サブスクリプションのユーザーがオンラインである場合は、前の例の CheckSubscriptionRootForRenewal 関数を最初に呼び出す必要があります。

public bool IsUsableLicenseAvailableForContent(System.IO.Stream contentFile)
{
    bool returnValue = false;

    // SelectLicenses works only if the user is running the Silverlight application offline
    // *and* elevated trust.
    IEnumerable<MediaLicense> myLicenses = LicenseManagement.SelectLicenses(contentFile);


    foreach (MediaLicense ML in myLicenses)
    {
        if (ML.Usable)
        {
            returnValue = true;
            break;
        }
    }

    return returnValue;
}

出力保護には、ライセンス ポリシー データ、ポリシー マネージャー、セキュリティで保護された準拠ドライバー、出力ポートの暗号化されたチャネル、準拠出力デバイスという、5 つの重要な部分があります。

ポリシー データ

ポリシー データは、PlayReady DRM ライセンスなどのライセンス内のデータです。 ライセンスには、一連の GUID を使用して、そのコンテンツに出力保護の特定の程度とフォームが必要であることを明示的に宣言するポリシーを含めることができます。 ライセンスには、必要な保護レベルを示す出力ごとに 1 つの数を持つポリシーを含めることもできます。この出力保護レベルには、別のフォームと出力保護の程度を割り当てる必要があります。

出力保護メカニズムに基づく暗黙的な保護レベルを使用して要求することができるポリシーの例を、次の表に示します。

ポリシー

説明

制限なし

コンテンツの重要度が相対的に低い可能性があり、どこにでもフローできることを示します。

ベスト エフォート

コンテンツの重要度がより高く、出力保護を試行しても実行することができない場合は、コンテンツのフローを許可することを示します。

Restricted

コンテンツが非常に重要なものであり、セキュリティ保護されていないチャネル上でのフローが許可されないことを示します。

使用できません

セキュリティで保護されているかされていないかにかかわらず、指定したチャネルからのコンテンツ フローが許可されないことを示します。

ポリシー マネージャー

ポリシー マネージャーは、個々のライセンスからデータを取得し、準拠ドライバーと通信して、ドライバー、ビデオ カード、オーディオ カード、モニター、モニターまたはスピーカーとコンピューターの間のすべてのデバイスの機能を検出します。 ライセンスで求められる出力保護レベルとハードウェアでのサポートに基づいて、コンテンツが送信されるかどうかをポリシー マネージャーが決定します。 コンテンツの送信が許可されていない場合は、エラーが返されます。 コンテンツのフローが許可されている場合、ポリシー マネージャーは、コンテンツの出力に使用する方法を決定します。

Silverlight を再生に使用する場合、これはポリシー マネージャーです。

ポリシー マネージャーとして、Silverlight は、その機能を判断するためにオーディオ カード ドライバーまたはスピーカーと通信します。

セキュリティで保護された準拠ドライバー

セキュリティで保護された準拠ビデオ ドライバーまたはオーディオ ドライバーは、コンテンツの保護基準 (たとえば、Windows ロゴ プログラムの一環として) を満たし、正しいドライバー インターフェイスを実装しているものの 1 つです。 Silverlight 出力保護の場合、必要なドライバー インターフェイスは COPP または OPM です。

COPP

Certified Output Protection Protocol (COPP) は、アプリケーションがグラフィックス カードとそれに接続されているドライブの保護レベルを照会できるようにするドライバー インターフェイスです。

COPP は、Windows Server 2003 SP1、Windows XP SP 2、およびそれ以降のオペレーティング システムで使用できます。

OPM

出力保護マネージャー (OPM) は、COPP に似ています。 OPM は、アプリケーションが、グラフィックス カードとグラフィックス カードに接続されているデバイスに対し、さまざまな出力保護メカニズムでサポートされるレベルに関してクエリを実行することを可能にするドライバー インターフェイスでもあります。 OPM には、クローン モードで実行されるマルチモニターのセットアップ機能や、コンピューターとレンダリング デバイス間にリピーターを配置する機能など、COOP でサポートされない機能があります。

OPM は Windows Vista、Windows Server 2008 (メディア デスクトップ エクスペリエンスが必要) およびそれ以降のオペレーティング システムで使用できます。

セキュリティで保護された、暗号化されたチャネル

暗号化されたビデオ フレームとオーディオ サンプルを、ビデオ カードやオーディオ カードからセキュリティで保護された出力まで伝える技術は多数あります。 技術には、アナログ コピー防止 (ACP)、Content Generation Management System Analog (CGMS-A)、高帯域幅デジタル コンテンツ保護 (HDCP)、DisplayPort コンテンツ保護プロトコル (DPCP) があります。HDCP と DPCP のみに実際のオーディオ送信機能があります。

以前のプロトコルは、コンポーネント、コンポジット、S-ビデオ、VGA、HDMI、DVI、DisplayPort など、多数の出力ポート上で動作します。

グラフィックス カードとディスプレイの間に複数のデバイスがある場合、他のデバイスが存在することがあります。 各デバイスは、使用されている出力保護の形式をサポートする必要があります。 たとえば、テレビに接続されている受信機や KVM スイッチにコンピューターを接続できます。

さまざまな出力保護技術は、特定のポートでのみ動作します。

次の表に、特定のポート タイプで使用できる出力保護形式を示します。

ポート タイプ

利用可能な出力保護の形式

DVI-A、MicroDVI、MiniDVI [アダプター経由の VGA] (アナログ)

DVI-D、MicroDVI、MiniDVI (デジタル)

HDCP

DVI-I、MicroDVI、MiniDVI (デジタル/アナログ)

HDCP (デジタルとして構成されている場合)

D-SUB [VGA] (アナログ)

HDMI (デジタル)

HDCP

コンポジット (アナログ)

CGMS-A, ACP

コンポーネント (アナログ)

CGMS-A, ACP

S-Video (アナログ)

CGMS-A, ACP

DisplayPort / MiniDiaplyPort (デジタル)

HDCP、DPCP

TOSLINK - S/PDIF オーディオ

SCMS

HDMI - オーディオ

HDCP

USB - オーディオ

Bluetooth - オーディオ

アナログ ジャック (たとえば 3.5 mm ケーブル) - オーディオ

同軸 – S/PDIF オーディオ

SCMS

DisplayPort - オーディオ

内部ビデオ出力

現在のほとんどのグラフィックス カードには、直接のコンポジット出力およびコンポーネント出力がありません。 コンポジット出力とコンポーネント出力を取得するには、通常、S-Video ポートのアダプターを使用します。

セキュリティで保護された出力

出力デバイスは、コンテンツを送信するために使用される、セキュリティで保護されたプロトコルをサポートする必要があります。 たとえば、今日のほとんどのディスプレイで、HDCP を使用できます。

Silverlight ランタイムは、PlayReady XMR 使用のセクション 4.2.2 で定義されている、オプションの Output Protection Level Restriction Object、Analog Video Output Configuration Restriction Object、および Digital Audio Output Configuration Restriction Object に含まれる出力保護レベルをサポートします。 (PlayReady XMR 仕様は、PlayReady のドキュメント パックにあります。)

ライセンス サーバーで設定できる出力保護レベルで許可される値は、PlayReady コンプライアンス規則によって制御されることに注意してください。 出力保護の詳細については、「PlayReady Compliance Rules (PlayReady コンプライアンス規則)」を参照してください。

Silverlight では、PlayReady コンプライアンス規則で指定されているように、出力保護ポリシーを持つコンテンツを出力コネクタ上でのみ再生できます。 PlayReady コンプライアンス規則で指定された出力コネクタ用語の詳細については、「Defined Terms for PlayReady Compliance and Robustness Rules (PlayReady コンプライアンスおよび堅牢性の規則に対して定義されている用語)」を参照してください。

Silverlight 5 での出力保護

PlayReady ライセンスの出力保護ポリシーに含まれる Silverlight 5 Beta の動作は、次の表のとおりです。

ポリシー

Windows 7 または Windows Vista

Windows XP

Macintosh

アナログ ビデオ出力の最小保護レベル

100

制限なし

制限なし

制限なし**

125

ベスト エフォート*

ベスト エフォート

制限なし**

150

ベスト エフォート

ベスト エフォート

制限なし**

200

Restricted

Restricted

拒否

>=201

拒否***

拒否***

拒否***

非圧縮デジタル ビデオ出力の最小保護レベル

100

制限なし

制限なし

制限なし**

150

ベスト エフォート*

ベスト エフォート*

制限なし**

250

ベスト エフォート

ベスト エフォート

制限なし**

300

Restricted

Restricted

拒否

>=301

拒否***

拒否***

拒否***

圧縮/非圧縮デジタル オーディオ出力の最小保護レベル

100

制限なし

制限なし

制限なし

150

拒否

拒否

拒否

200

拒否

拒否

拒否

250

拒否

拒否

拒否

300

拒否

拒否

拒否

>=301

拒否

拒否

拒否

明示的なアナログ ビデオ出力保護

CGMS-A 出力保護 ID

すべての構成値

(「PlayReady Compliance Rules (PlayReady コンプライアンス規則)」を参照)

PlayReady コンプライアンス規則に従って適用

PlayReady コンプライアンス規則に従って適用

拒否

画像制約トークン出力保護 ID

(「PlayReady Compliance Rules (PlayReady コンプライアンス規則)」を参照)

拒否

拒否

拒否

AGC/カラー ストライプ出力保護 ID

すべての構成値

(「PlayReady Compliance Rules (PlayReady コンプライアンス規則)」を参照)

拒否

拒否

拒否

明示的なデジタル オーディオ出力保護

SCMS 出力保護 ID

すべての構成値

(「PlayReady Compliance Rules (PlayReady コンプライアンス規則)」を参照)

拒否

拒否

拒否

  • * 出力コネクタを決定できない場合は再生が許可されることがあります。 Silverlight は、この場合にすべての出力保護ポリシーを評価し、最も制限の厳しいポリシーを適用します。

  • ** Silverlight は、この場合にすべての出力保護ポリシーを評価し、最も制限の厳しいポリシーを適用します。

  • *** コネクタを判断できない場合は、この出力保護レベル (出力保護レベル ポリシーからは独立) の存在により拒否になります

Silverlight 4 での出力保護

PlayReady ライセンスの出力保護ポリシーに含まれる Silverlight 4 の動作は、次の表のとおりです。

ポリシー

Windows 7 または Windows Vista

Windows XP

Macintosh

アナログ ビデオ出力の最小保護レベル

100

制限なし

制限なし

制限なし

150

Restricted

Restricted

制限あり3

200

Restricted

Restricted

拒否

>=201

制限あり1

制限あり1

制限あり1

非圧縮デジタル ビデオ出力の最小保護レベル

100

制限なし

制限なし

制限なし

250

ベスト エフォート

ベスト エフォート

ベスト エフォート3

270

(<=520k ピクセル)

ベスト エフォート

ベスト エフォート

ベスト エフォート

270

(>520k ピクセル)

Restricted

Restricted

拒否

300

Restricted

Restricted

拒否

>=301

拒否

拒否

拒否

圧縮デジタル ビデオ出力の最小保護レベル

>=0

制限あり1

制限あり1

制限あり1

圧縮/非圧縮デジタル オーディオ出力の最小保護レベル

100

制限なし

制限なし

制限なし

150

拒否

拒否

拒否

200

拒否

拒否

拒否

250

拒否

拒否

拒否

300

拒否

拒否

拒否

>=301

制限あり1

制限あり1

制限あり1

明示的なアナログ ビデオ出力保護

CGMS-A 出力保護 ID

すべての構成値

(「PlayReady Compliance Rules (PlayReady コンプライアンス規則)」を参照)

Restricted

Restricted

CGMS-A2 と同じです。

画像制約トークン出力保護 ID

(「PlayReady Compliance Rules (PlayReady コンプライアンス規則)」を参照)

拒否

拒否

拒否

AGC/カラー ストライプ出力保護 ID

すべての構成値

(「PlayReady Compliance Rules (PlayReady コンプライアンス規則)」を参照)

拒否

拒否

拒否

明示的なデジタル オーディオ出力保護

SCMS 出力保護 ID

すべての構成値

(「PlayReady Compliance Rules (PlayReady コンプライアンス規則)」を参照)

拒否

拒否

拒否

  • 1このケースでは、常に結果はブロック

  • 2 最小のアナログ ビデオの出力保護のレベル = 200 と設定するのと同じ

  • 3このケースでは、常に結果は再生

機能の混在

デュアル モニターのセットアップでは、保護がサポートされる出力に 1 つのモニターが接続され、サポートされない出力にもう 1 つのモニターが接続されることがあります。 たとえば、出力保護がサポートされないテレビや出力保護がサポートされないモニターにコンピューターを接続できます。 機能が混在するこれらのケースで、両方の接続はライセンスで要求される出力保護レベルに従う必要があります。 両方が準拠していない場合は、再生がブロックされます。 出力保護ポリシーは、提供されている最低レベルの保護ポートに基づいて解釈されます。 次の表に、4 つの基本ポリシーの解釈を示します。

ポリシー

解釈

制限なし

解釈の変更はありません。 接続では、保護されたポートまたは保護されていないポートを任意に組み合わせることができます。

ベスト エフォート

1 つまたは複数の出力でコンテンツ保護がサポートされない場合、すべての出力の試行 (一部は失敗) の後で、コンテンツが再生されます。

Restricted

すべての接続が必要なレベルの出力保護を使用できない場合は、コンテンツの再生をブロックします。

使用できません

すべてのコンテンツ出力がブロックされているため、解釈は変更されません。

キー ローテーション

Version 5 より前の Silverlight では、コンテンツ プロバイダーが暗号化されたコンテンツに特定のポリシーを適用できます。 これらのポリシーは、通常、コンテンツのポリシーとコンテンツ キーが単一ライセンスの一部である単一ライセンスに関連付けられます。 ただし、ライブ TV のシナリオでは、システム全体でポリシーとライセンスが管理される方法について新しい課題が発生します。 これらのシナリオでは、ストリーム内の任意の時点でコンテンツ キーとポリシーの両方を変更することができ、クライアント アプリケーションはリアルタイムでこれらのポリシーを適用する必要があります。

PlayReady 2.0 サーバー技術では、これらの新しいライブ TV のシナリオと、Protected Interoperable File Format (PIFF) 仕様のその対応するサポートが提供されます。 Silverlight 5 Beta クライアントは、開発者のためのポリシーの変更の実施を管理します。 特別なクライアント アプリケーションのコードは必要ありません。 Microsoft は PIFF コンテンツの消費のサポートを提供します。 詳細については、「Smooth Streaming Client (スムーズ ストリーミング クライアント)」を参照してください。 PlayReady サーバー技術のライセンスの詳細については、PlayReady のサイトを参照してください。

Silverlight 5 Beta 開発者は Silverlight の MediaStreamSource を使用して、自分のクライアントの実装を構築することができます。 自身の MediaStreamSource を構築する場合は、ポリシー変更をコンテンツ プロバイダーまたは演算子によってトリガーすることができ、クライアントは新しいライセンスで指定された出力保護を即時に実行することに注意する必要があります。 出力保護は DRM の復号化機能のセットアップ時に実行されます。 コンテンツ PlayReady ライセンスで定義されている必要な保護を実行できない場合は、暗号化解除機能の作成が失敗します。 エラーは、MediaStreamSourceDrmSetupDecryptorCompleted() イベントの DrmSetupDecryptorCompletedEventArgs パラメーターで使用できます。

COPP および OPM ドライバーの考慮事項

COPP または OPM を使用する前に、グラフィックス カードの COPP または OPM 証明書を検証し、失効リストに含まれていないことを確認する必要があります。 確認時に証明書が失効しているか有効でない場合、Silverlight ランタイムは MediaFailed イベントをエラー コード 6036 で発生させます。

検証および失効リストとの照合の方法の詳細については、「Validating the Certificate Chain (証明書チェーンの検証)」を参照してください。

出力保護関連 API

Silverlight で次の API を使用して、デバイスで使用可能な出力保護を検出できます。 この情報をライセンス要求に追加し、サーバーで、コンテンツを再生するかどうかを決定できます。

LicenseManagement.VideoOutputConnectors プロパティ

グラフィックス カードからコネクタ タイプに関するデータをすべて取得します。また、各ビデオ出力用に Silverlight が使用できる出力保護も取得します。

VideoOutputConnector クラス

VideoOutputConnectors プロパティによって返され、コネクタ タイプと、Silverlight が使用できる出力保護に関する実際のデータを提供します。

VideoOutputConnectorType 列挙体

VideoOutputConnector.ConnectorType プロパティによって返され、すべての一般に利用できる出力コネクタ タイプを定義します。

Silverlight MediaFailed エラー メッセージ

この機能のエラーは、すべて MediaFailed イベントを通じて伝達され、すべてが再生中の変更に関連しています。

エラー コード

メモ

6030

"このコンテンツを表示するには、このマシンで有効にできない出力保護が必要です"

このエラーは、サポートされていないライセンス保護がライセンスに含まれているたびに、MediaFailed イベント経由で発生します。 このエラーは、MediaOpened イベントが発生する前に表示されます。

6031

"セキュリティで保護されたビデオ出力接続の整合性が、侵害されているか失われています。"

このエラーは、Silverlight が GetInformation を介して OPM インターフェイスをポーリングし、OPM_STATUS_LINK_LOST フラグが返されるたびに、MediaFailed イベント経由で発生します。

6032

"このセキュリティで保護されたグラフィックス接続には再ネゴシエートが必要ですが、再ネゴシエートできませんでした。"

このエラーは、Silverlight が GetInformation を介して OPM インターフェイスをポーリングし、OPM_STATUS_RENEGOTIATION_REQUIRED フラグが返されるたびに、MediaFailed イベント経由で発生します。

6033

"失効した高帯域幅デジタル コンテンツ保護 (HDCP) デバイスが、ビデオ出力に接続されています。"

このエラーは、Silverlight が GetInformation を介して OPM インターフェイスをポーリングし、OPM_STATUS_REVOKED_HDCP_DEVICE_ATTACHED フラグが返されるたびに、MediaFailed イベント経由で発生します。

6034

"グラフィックス アダプターまたはドライバーが改ざんされています。"

このエラーは、Silverlight が GetInformation を介して OPM インターフェイスをポーリングし、OPM_STATUS_TAMPERING_DETECTED フラグが返されるたびに、MediaFailed イベント経由で発生します。

6035

"新しいグラフィックス接続が再生中に追加されたため、再生が中止されました。"

WM_DeviceChange/RegisterDeviceNotificatio を使用して追加されるモニターを追跡します。 出力保護を必要とする保護されたコンテンツの再生中に新しいモニターが追加された場合、出力保護を必要とする保護されたコンテンツの場合のみ、MediaFailed イベントが発生します。

6036

"グラフィックス デバイスのドライバー証明書が無効です。"

ランタイムで、無効な OPM または COPP 証明書が検出されたときに発生します。

6037

「このコンテンツはリモート セッションで再生できません」

アプリケーション制限メディアは Silverlight 5 Beta の新機能であり、コンテンツ プロバイダーは、DRM に基づく自身のコンテンツが、認定する Silverlight アプリケーションによってのみ使用されるようにすることができます。 この保護は、収益を生成する広告コンテンツを含むメディアで特に便利です。

アプリケーション制限メディアを有効にするには、信頼された Silverlight アプリケーションを作成するのと同じように、Authenticode x.509 証明書を使用してアプリケーションに署名する必要があります。 詳細については、信頼されたアプリケーション のトピックを参照してください。

メモ メモ :

コンテンツを使用する Silverlight アプリケーションを信頼されたアプリケーションにする必要はありません。

アプリケーションに署名するには、2 とおりの方法があります。 SignTool.exe コマンドライン ツールを使用するか、Visual Studio の署名機能を使用できます。

SignTool.exe を使用してアプリケーションに署名する方法のコマンド例を次に示します。

signtool sign /v /f certificateFile.pfx fileToSign

Visual Studio を使用してアプリケーションに署名するには、アプリケーションのプロジェクトのプロパティを開きます。 [署名] タブで、アプリケーションに署名する設定を指定します。

この情報は役に立ちましたか。
(残り 1500 文字)

コミュニティの追加

追加
© 2013 Microsoft. All rights reserved.