驗證應用程式
應用程式必須執行的第一個步驟是驗證。 驗證會向 Windows Media 裝置管理員驗證應用程式的身分識別。 驗證應用程式之後,您可以呼叫 QueryInterface 來取得根 IWMDeviceManager 介面,此介面可以查詢其他必要介面,而該介面本身可以查詢所有其他介面。 在啟動時,驗證只需要進行一次。
若要驗證您的應用程式,請執行下列步驟:
- CoCreate mediaDevMgr 物件 (類別識別碼 MediaDevMgr) ,並要求 IComponentAuthenticate 介面。
- 建立 CSecureChannelClient 物件來處理驗證。
- 將您的應用程式金鑰和傳輸憑證傳遞至安全通道物件。 您可以使用下列範例程式碼所示的虛擬金鑰/憑證,從 SDK 函式取得基本功能。 不過,若要取得完整功能 (將檔案傳遞至裝置) 很重要,您必須要求 Microsoft 的金鑰和憑證,如 開發工具中所述。
- 將您在步驟 1 中建立的 IComponentAuthenticate 介面傳遞至安全通道物件。
- 呼叫 CSecureChannelClient::Authenticate 來驗證您的應用程式。
- 查詢 IComponentAuthenticate 以取得 IWMDeviceManager 介面。
下列步驟會顯示在下列 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;
}
相關主題