アプリケーションの認証

アプリケーションで実行する必要がある最初の手順は認証です。 認証は、Windows Media デバイス マネージャーに対するアプリケーションの ID を検証します。 アプリケーションを認証したら、 QueryInterface を 呼び出してルート IWMDeviceManager インターフェイスを取得できます。このインターフェイスは、他のすべてのインターフェイスに対してクエリを実行できる他の必要なインターフェイスに対してクエリを実行できます。 認証は、起動時に 1 回だけ行う必要があります。

アプリケーションを認証するには、次の手順を実行します。

  1. MediaDevMgr オブジェクト (クラス ID MediaDevMgr ) を作成し、 IComponentAuthenticate インターフェイスを要求します。
  2. 認証を処理する CSecureChannelClient オブジェクトを作成します。
  3. アプリケーション キーを渡し、セキュリティで保護されたチャネル オブジェクトに証明書を転送します。 次のコード例に示すダミー キー/証明書を使用して、SDK 関数から基本的な機能を取得できます。 ただし、完全な機能 (デバイスとの間でファイルを渡すために重要) を取得するには、「 開発用ツール」の説明に従って、Microsoft にキーと証明書を要求する必要があります。
  4. 手順 1 で作成した IComponentAuthenticate インターフェイスをセキュリティで保護されたチャネル オブジェクトに渡します。
  5. CSecureChannelClient::Authenticate を呼び出して、アプリケーションを認証します。
  6. 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;
}

Windows Media デバイス マネージャー アプリケーションの作成