アプリケーションの認証
アプリケーションで実行する必要がある最初の手順は認証です。 認証は、Windows Media デバイス マネージャーに対するアプリケーションの ID を検証します。 アプリケーションを認証したら、 QueryInterface を 呼び出してルート IWMDeviceManager インターフェイスを取得できます。このインターフェイスは、他のすべてのインターフェイスに対してクエリを実行できる他の必要なインターフェイスに対してクエリを実行できます。 認証は、起動時に 1 回だけ行う必要があります。
アプリケーションを認証するには、次の手順を実行します。
- MediaDevMgr オブジェクト (クラス ID MediaDevMgr ) を作成し、 IComponentAuthenticate インターフェイスを要求します。
- 認証を処理する CSecureChannelClient オブジェクトを作成します。
- アプリケーション キーを渡し、セキュリティで保護されたチャネル オブジェクトに証明書を転送します。 次のコード例に示すダミー キー/証明書を使用して、SDK 関数から基本的な機能を取得できます。 ただし、完全な機能 (デバイスとの間でファイルを渡すために重要) を取得するには、「 開発用ツール」の説明に従って、Microsoft にキーと証明書を要求する必要があります。
- 手順 1 で作成した IComponentAuthenticate インターフェイスをセキュリティで保護されたチャネル オブジェクトに渡します。
- CSecureChannelClient::Authenticate を呼び出して、アプリケーションを認証します。
- IWMDeviceManager インターフェイスの IComponentAuthenticate を照会します。
これらの手順は、次の C++ コードに示されています。
HRESULT CWMDMController::Authenticate()
{
// Use a dummy key/certificate pair to allow basic functionality.
// An authentic keypair is required for full SDK functionality.
BYTE abPVK[] = {0x00};
BYTE abCert[] = {0x00};
HRESULT hr;
CComPtr<IComponentAuthenticate> pAuth;
// Create the WMDM object and acquire
// its authentication interface.
hr = CoCreateInstance(
__uuidof(MediaDevMgr),
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(IComponentAuthenticate),
(void**)&pAuth);
if (FAILED(hr)) return hr;
// Create the secure channel client class needed to authenticate the application.
// We'll use a global member variable to hold the secure channel client
// in case we need to handle encryption, decryption, or MAC verification
// during this session.
m_pSAC = new CSecureChannelClient;
if (m_pSAC == NULL) return E_FAIL;
// Send the application's transfer certificate and the associated
// private key to the secure channel client.
hr = m_pSAC->SetCertificate(
SAC_CERT_V1,
(BYTE *)abCert, sizeof(abCert),
(BYTE *)abPVK, sizeof(abPVK));
if (FAILED(hr)) return hr;
// Send the authentication interface we created to the secure channel
// client and authenticate the application with the V1 protocol.
// (This is the only protocol currently supported.)
m_pSAC->SetInterface(pAuth);
hr = m_pSAC->Authenticate(SAC_PROTOCOL_V1);
if (FAILED(hr)) return hr;
// Authentication succeeded, so we can use WMDM.
// Query for the root WMDM interface.
hr = pAuth->QueryInterface( __uuidof(IWMDeviceManager), (void**)&m_IWMDMDeviceMgr);
return hr;
}
関連トピック