現在オフラインです。再接続するためにインターネットの接続を待っています

Windows 7 ベースまたは Windows Server 2008 R2 ベースのコンピューターで読み取り装置にスマート カードを挿入するときにエラー メッセージ:「デバイス ドライバー ソフトウェアがインストールできませんでした」

重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。

英語版 KB:976832
現象
スマート カード リーダーにスマート カードを挿入するときに Windowsはプラグ アンド プレイ サービスを使用しスマートカードのミニドライバをダウンロードし、インストールしようとします。スマート カード用のドライバーは Windows の更新、WSUS、イントラネット パスなど、事前に構成された場所のいずれかで、システムにカスタムの暗号化サービス プロバイダーがインストールされていない場合は、通知領域に次のエラー メッセージが表示されます。
デバイス ドライバー ソフトウェアが正常にインストールされていません
詳細については、ここをクリックします。
このエラー メッセージは、数秒後に消えます。

さらに、デバイス マネージャーで、[その他のデバイス、スマート カード デバイスのステータスを持つ"DNF"(ドライバーが見つかりません)。

これには、ユーザーがこのエラーを解決するのにはスマート カードの発行元から取得する次の項目のいずれかの頻繁に必要があります。
  1. Windows のロゴを取得したスマート カード ミニドライバー
  2. スマート カード用のカスタムの暗号化サービス プロバイダー (CSP)。
  3. Windows のロゴを取得したスマート カードのミニドライバー
  4. 他のミドルウェア、ActiveX コントロール、PKCS #11 ソフトウェア、またはその他のカスタム ソフトウェアなど。
ただし、唯一の項目 3 または 4 をこのリストからのユーザーを指定すると、スマート カードがシステム上で作業を続けます。ただし、ユーザーは、エラー メッセージに記載されているここたびにスマート カードを挿入することです。

この問題は、Windows 7、Windows Server 2008 R2、および両方のオペレーティング システムのそれ以降のバージョンのすべてのリリースに影響します。
原因
すべてのスマート カードには、ユーザーが追加のソフトウェアをインストールしなくても、カードを使用できる受信トレイのドライバーがない限り、Windows で動作するその他のソフトウェアが必要です。Windows スマート カード フレームワークは、スマート カード リーダーに挿入すると、Windows Update または WSUS サーバーなどのような他の場所からスマート カードの minidrivers の自動的にダウンロードを有効にする Windows 7 で改良されました。Windows ロゴ プログラムによって発行された、ロゴの要件を通過するすべてのスマート カードは、この機能を利用します。

ただし、Windows でのスマート カードを使用するために必要なソフトウェアがロゴを取得したかが、ミニドライバー、PKCS #11 ドライバー、カスタムの CSP、ミドルウェア、ActiveX コントロールなどとは異なる型の場合は、Microsoft スマート カードの minidrivers のみを証明するため、自動オプションが失敗した場合はダウンロードします。したがってのカスタムの CSP が既に登録されていないカードを挿入すると、ユーザーは、ドライバー ソフトウェアがスマート カード デバイスに不足している場合でも、ユーザーがカスタム インストールからのユーザーのコンピューターにインストールされた追加のソフトウェアをスマート カードを使用できることを示すエラー メッセージを受信します。
解決方法
スマート カードは、ユーザーに表示されるエラー メッセージがあっても作業を続行して、スマート カード発行者、ベンダー、または製造元使用できます次のいずれか、このエラーを解決します。

スマート カード ミニドライバーを実装します。

カード発行者、ベンダー、および製造元スマート カードの minidrivers を実装し、スマート カード プラグ アンド プレイのスマート カードのデバイス ステージなどのプラットフォームに導入された改善からメリットを享受するのには Windows ロゴ プログラムに参加することをお勧めしています。

Windows 用のスマート カード ミニドライバーの仕様の詳細については、次のマイクロソフト Web サイトを参照してください。 スマート カードの minidrivers のロゴを取得するプロセスを開始する方法の詳細については、次の Windows ロゴ プログラムの Web サイトを参照してください。

スマート カードに対して NULL ドライバーを実装します。

カスタム ソフトウェア PKCS #11 ドライバーがこのような ActiveX コントロールの場合、またはその他のいくつかのミドルウェアは、Windows では、スマート カードの使用を有効にする必要な場合、スマート カード ミニドライバーまたはカスタムの CSP を実装することは実用的な選択肢ではありません、カード発行会社、仕入先、またはメーカーを検討してください NULL ドライバーを Windows Update への送信をお勧めします。NULL ドライバーが Windows Update から入手可能であることを確認するための一般的なプロセスには、Winqual を通じて未分類のデバイスが正常終了した提出書類が必要です。、今後は、がある場合、ミニドライバーこれらのカードの利用可能な、新しいドライバーを Windows ロゴ プログラムに参加することによって Windows Update をアップロードできます。NULL ドライバーは、エンド ・ ユーザーが手動でダウンロードできますか、オプションの更新プログラムを使用して利用可能です。

スマート カード用の NULL ドライバー用のサンプル テンプレートを次に示します。
;; Null Driver for Fabrikam Smartcard installation x86 and x64 package.;[Version]Signature="$Windows NT$"Class=SmartCardClassGuid={990A2BD7-E738-46c7-B26F-1CF8FB9F1391}Provider=%ProviderName%CatalogFile=delta.catDriverVer=4/21/2006,1.0.0.0[Manufacturer]%ProviderName%=Minidriver,NTamd64,NTamd64.6.1,NTx86,NTx86.6.1[Minidriver.NTamd64];This driver has no applicability on OS versions earlier than Windows 7[Minidriver.NTx86];This driver has no applicability on OS versions earlier than Windows 7[Minidriver.NTamd64.6.1]%CardDeviceName%=Minidriver64_Install,<DEVICE_ID>;%CardDeviceName%=Minidriver64_Install,<DEVICE_ID2>;%CardDeviceName%=Minidriver64_Install,<DEVICE_ID3>;...[Minidriver.NTx86.6.1]%CardDeviceName%=Minidriver32_Install,<DEVICE_ID>;%CardDeviceName%=Minidriver32_Install,<DEVICE_ID2>;%CardDeviceName%=Minidriver32_Install,<DEVICE_ID3>;...;Leave the following sections blank[DefaultInstall][DefaultInstall.ntamd64][DefaultInstall.NTx86][DefaultInstall.ntamd64.6.1][DefaultInstall.NTx86.6.1][Minidriver64_Install.NT][Minidriver64_61_Install.NT][Minidriver32_Install.NT][Minidriver32_61_Install.NT][Minidriver64_61_Install.NT.Services]AddService = ,2[Minidriver32_61_Install.NT.Services]AddService = ,2; =================== Generic ==================================[Strings]ProviderName ="Microsoft"CardDeviceName="Fabrikam Generic Smart card"
サンプル DEVICE_ID 文字列によって参照されているハードウェア デバイスの ID を生成するには、スマート カード ミニドライバーの仕様に従ってボックスをオンにします。これを行うには、次のマイクロソフト Web サイトを参照してください。

NULL ドライバーをマイクロソフトに送信する方法の詳細については、Microsoft カスタマー サポート サービスにお問い合わせください。

管理されたコンピューターのグループ ポリシーによってスマート カード プラグ アンド プレイを無効にします。

このオプションは、管理者と SMS などのソフトウェア管理ツールを使用して、企業内で使用されているスマート カードで動作するために必要なソフトウェアがインストールされているすべてのコンピューターを管理するエンタープライズ環境でのみ推奨します。

この手順は、環境内のすべてのスマート カードに影響するために以下の環境でまったくお勧めできない。
  • オンライン ・ バンキングなどのエンドユーザーを対象とする業務用の展開
  • 環境の両方を含むプラグ アンド プレイ スマート カードおよびスマート カードのプラグ アンド プレイを無効にするグループ ポリシーを使用する非プラグ アンド プレイ スマート カード
グループ ポリシーなどのメカニズムによって、エンド ・ ユーザーのコンピューターを管理する企業で、スマート カードのプラグ アンド プレイを完全に無効にできます。

展開では、非プラグ アンド プレイ スマート カード ソリューションのみを使用する場合クライアント コンピューター上のローカル管理者でスマート カードのプラグ アンド プレイを無効にすることができます。スマート カード プラグ アンド プレイを無効にすると、スマート カードのドライバー、スマート カードの minidrivers とも呼ばれますはダウンロードできなくなります。また、スマート カードのプラグ アンド プレイ メッセージを防止します。

スマート カードのプラグ アンド プレイでローカル グループ ポリシーを無効にするには、次の手順を実行します。
  1. 開始] をクリックしての種類 gpedit.msc検索プログラムおよびファイル] ボックスで、ENTER キーを押します。
  2. コンソール ツリーで [コンピューターの構成管理用テンプレート] をクリックします。
  3. 詳細ペインでは、 Windows コンポーネントをダブルクリックし、[スマート カード] をダブルクリックします。
  4. スマート カードのプラグ アンド プレイ サービスを有効にするを右クリックし、[編集] をクリックします。
  5. 無効] をクリックし、[ OK] をクリックします。

エンド ・ ユーザーのシステムを変更して、特定のカード用のスマート カード プラグ アンド プレイを無効にします。

これは、最も推奨されるオプションです。カードは、従来のカードと、将来のスマート カードの minidrivers を実装する計画がない場合にのみ、このオプションを使用する必要があります。このオプションは、システムに既にインストールされている既存のソフトウェアでは Windows が通知、エンド ・ ユーザーのシステムでこのような CSP が存在しない場合でもシステムにインストールされているカスタムの CSP が必要です。Windows は、システムに既にインストールされているカスタムの CSP があることを決定をするとすぐに Windows を試みないをダウンロードして、スマート カードのプラグ アンド プレイ ドライバーをインストールします。スマート カード デバイスのデバイス ノードは作成されませんがデバイス マネージャーに表示されます。このオプションは、システム レジストリに、次の変更が得られます。

サブキー:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Calais\SmartCards\<Smart card name>
サブキーのレジストリ エントリ:
  • ATR = 16 進数の DWORD: コンマ区切りのスマート カードの ATR。
  • ATRMask = 16 進数の DWORD: コンマ区切りの ATR ATR で意味のないバイトをマスクに適用するマスク。
  • 暗号化プロバイダーの文字列の値を =: スマート カードに関連するいくつかの文字列です。
次に例を示します。
サブキー:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Calais\SmartCards\Fabrikam ATM card
サブキーのレジストリ エントリ:
  • ATR = 16 進数の DWORD: 3 b、dc では、13, 00, 40、3 a、49、54、47、5f、4 d は、50、53、43、53 5f、56、32
  • ATRMask = 16 進数の DWORD: ff、ff、ff、ff、ff、ff、ff、ff、ff、ff、ff、ff、ff、ff、ff、ff、ff、ff
  • 暗号化プロバイダーの文字列の値を =:「Fabrikam ATM ダミー プロバイダー」
X64 ビット システムでは、次のサブキーの下で同じ変更を行う必要があります。
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Cryptography\Calais\SmartCards


、システム レジストリを直接変更するには、代わりに使用すること WinSCard Api システムにこれらの変更を導入することをお勧めします。ここでは、スマート カードの挿入を検出し、カードを存在しないプロバイダーに関連付けるレジストリ エントリを作成することによって、特定のカード用のスマート カード プラグ アンド プレイを無効にするサンプル コードの例です。

マイクロソフトでは解説することのみを目的としてプログラミング例を提供しています。暗示あるいは明示していることに対しての保証はしておりません。ここで言う保証とは、特定の目的に対する商品性や適合性の暗示的保証を含んでいますが、それに限定されるわけではありません。この資料では、例示されているプログラミング言語およびプロシージャの作成やデバッグに使用するツールにお客様が精通していることを前提としています。マイクロソフトのサポート エンジニアは、特定のプロシージャの機能について説明することができます。ただし、お客様固有の要件を満たすために、追加機能の提供またはプロシージャの作成のために、これらの例に変更を加えたりはしません。
//==============================================================;////  Disable Smart card Plug and Play for specific cards////  Abstract://      This is an example of how to create a new//      Smart Card Database entry when a smart card is inserted//      into the computer.////  This source code is only intended as a supplement to existing Microsoft//  documentation.////  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY//  KIND, EITHER EXPRESSED OR IMPLIED. THIS INCLUDES BUT NOT LIMITED TO THE//  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR//  PURPOSE.////  Copyright (C) Microsoft Corporation.  All Rights Reserved.////==============================================================;// This code must be compiled with UNICODE support to work correctly#ifndef UNICODE#define UNICODE#endif#include <windows.h>#include <winscard.h>#include <stdio.h>#include <strsafe.h>#include <rpc.h>// Change this prefix to specify what the beginning of the// introduced card name in the registry will be. This is// be prepended to a GUID value.#define CARD_NAME_PREFIX    L"MyCustomCard"// This is the name that will be provided as the CSP for // the card when introduced to the system. This is provided// in order to disable Smart Card Plug and Play for this// card.#define CARD_CSP            L"$DisableSCPnP$"// This special reader name is used to be notified when// a reader is added to or removed from the system through// SCardGetStatusChange.#define PNP_READER_NAME     L"\\\\?PnP?\\Notification"// Maximum ATR length plus alignment bytes. This value is// used in the SCARD_READERSTATE structure#define MAX_ATR_LEN         36LONG GenerateCardName(    __deref_out LPWSTR  *ppwszCardName){    LONG        lReturn = NO_ERROR;    HRESULT     hr = S_OK;    DWORD       cchFinalString = 0;    WCHAR       wszCardNamePrefix[] = CARD_NAME_PREFIX;    LPWSTR      pwszFinalString = NULL;    UUID        uuidCardGuid = {0};    RPC_WSTR    pwszCardGuid = NULL;    RPC_STATUS  rpcStatus = RPC_S_OK;    // Parameter check    if (NULL == ppwszCardName)    {        wprintf(L"Invalid parameter in GenerateCardName.\n");        return ERROR_INVALID_PARAMETER;    }    // Generate GUID    rpcStatus = UuidCreate(&uuidCardGuid);    if (RPC_S_OK != rpcStatus)    {        wprintf(L"Failed to create new GUID with error 0x%x.\n");        lReturn = (DWORD)rpcStatus;    }    else    {        // Convert GUID to string        rpcStatus = UuidToString(&uuidCardGuid, &pwszCardGuid);        if (RPC_S_OK != rpcStatus)        {            wprintf(L"Failed to convert new GUID to string with error 0x%x.\n", rpcStatus);            lReturn = (DWORD)rpcStatus;        }        else        {            // Allocate memory for final string            // Template is <prefix>-<guid>            cchFinalString = (DWORD)(wcslen(wszCardNamePrefix) + 1 + wcslen((LPWSTR)pwszCardGuid) + 1);            pwszFinalString = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, cchFinalString * sizeof(WCHAR));            if (NULL == pwszFinalString)            {                wprintf(L"Out of memory.\n");                lReturn = ERROR_OUTOFMEMORY;            }            else            {                // Create final string                hr = StringCchPrintf(                            pwszFinalString,                            cchFinalString,                            L"%s-%s",                            wszCardNamePrefix,                            pwszCardGuid);                if (FAILED(hr))                {                    wprintf(L"Failed to create card name with error 0x%x.\n", hr);                    lReturn = (DWORD)hr;                }                else                {                    // Set output params                    *ppwszCardName = pwszFinalString;                    pwszFinalString = NULL;                }            }        }    }    if (NULL != pwszCardGuid)    {        RpcStringFree(&pwszCardGuid);    }    if (NULL != pwszFinalString)    {        HeapFree(GetProcessHeap(), 0, pwszFinalString);    }    return lReturn;}LONG IntroduceCardATR(    __in SCARDCONTEXT   hSC,    __in LPBYTE         pbAtr,    __in DWORD          cbAtr){    LONG    lReturn = NO_ERROR;    LPWSTR  pwszCardName = NULL;        // Parameter checks    if (NULL == hSC || NULL == pbAtr || 0 == cbAtr)    {        wprintf(L"Invalid parameter in IntroduceCardATR.\n");        return ERROR_INVALID_PARAMETER;    }    // Generate a name for the card    lReturn = GenerateCardName(&pwszCardName);    if (NO_ERROR != lReturn)    {        wprintf(L"Failed to generate card name with error 0x%x.\n", lReturn);    }    else    {        // Introduce the card to the system        lReturn = SCardIntroduceCardType(                                hSC,                                pwszCardName,                                NULL,                                NULL,                                0,                                pbAtr,                                NULL,                                cbAtr);        if (SCARD_S_SUCCESS != lReturn)        {            wprintf(L"Failed to introduce card '%s' to system with error 0x%x.\n", pwszCardName, lReturn);        }        else        {            // Set the provider name            lReturn = SCardSetCardTypeProviderName(                                        hSC,                                        pwszCardName,                                        SCARD_PROVIDER_CSP,                                        CARD_CSP);            if (SCARD_S_SUCCESS != lReturn)            {                wprintf(L"Failed to set CSP for card '%s' with error 0x%x.\n", pwszCardName, lReturn);            }            else            {                wprintf(L"Card '%s' has been successfully introduced to the system and has had Plug and Play disabled.\n", pwszCardName);            }        }    }    if (NULL != pwszCardName)    {        HeapFree(GetProcessHeap(), 0, pwszCardName);    }    return lReturn;}LONG ProcessCard(    __in SCARDCONTEXT           hSC,    __in LPSCARD_READERSTATE    pRdr){    LONG        lReturn = NO_ERROR;    DWORD       dwActiveProtocol = 0;    DWORD       cbAtr = MAX_ATR_LEN;    DWORD       dwIndex = 0;    DWORD       cchCards = SCARD_AUTOALLOCATE;    LPWSTR      pmszCards = NULL;    BYTE        rgbAtr[MAX_ATR_LEN] = {0};    SCARDHANDLE hSCard = NULL;    // Parameter checks    if (NULL == hSC || NULL == pRdr)    {        wprintf(L"Invalid parameter in ProcessCard.\n");        return ERROR_INVALID_PARAMETER;    }    // Connect to the card in the provided reader in shared mode    lReturn = SCardConnect(                    hSC,                    pRdr->szReader,                    SCARD_SHARE_SHARED,                    SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,                    &hSCard,                    &dwActiveProtocol);    if (SCARD_S_SUCCESS != lReturn)    {        wprintf(L"Failed to connect to card in reader '%s' with error 0x%x.\n", pRdr->szReader, lReturn);    }    else    {        wprintf(L"Connected to card in reader '%s'.\n", pRdr->szReader);        /*         * In this spot, put any necessary calls needed to identify that this         * is the type of card you are looking for. Usually this is done via         * SCardTransmit calls. For this example, we will grab the ATR of every         * inserted card.         */        // Obtain the ATR of the inserted card        lReturn = SCardGetAttrib(                            hSCard,                            SCARD_ATTR_ATR_STRING,                            rgbAtr,                            &cbAtr);        if (SCARD_S_SUCCESS != lReturn)        {            wprintf(L"Failed to obtain ATR of card in reader '%s' with error 0x%x.\n", pRdr->szReader, lReturn);        }        else        {            // Output the ATR            wprintf(L"ATR of card in reader '%s':", pRdr->szReader);            for (dwIndex = 0; dwIndex < cbAtr; dwIndex++)            {                wprintf(L" %02x", rgbAtr[dwIndex]);            }            wprintf(L"\n");            // Determine if the ATR is already in the Smart Card Database            lReturn = SCardListCards(                                hSC,                                rgbAtr,                                NULL,                                0,                                (LPWSTR)&pmszCards,                                &cchCards);            if (SCARD_S_SUCCESS != lReturn)            {                wprintf(L"Failed to determine if card in reader '%s' is currently recognized by the system with error 0x%x. Skipping.\n", pRdr->szReader, lReturn);            }            else if (NULL == pmszCards || 0 == *pmszCards)            {                // Card not found. We need to add it.                wprintf(L"Card in reader '%s' is not currently recognized by the system. Adding ATR.\n", pRdr->szReader);                lReturn = IntroduceCardATR(                                    hSC,                                     rgbAtr,                                     cbAtr);                // If an error occurs here, we will continue so we can try the next time                // the card is inserted as well as examine other readers.            }            else            {                wprintf(L"Card in reader '%s' is already known by the system. Not adding ATR.\n", pRdr->szReader);            }        }    }    // Disconnect from the card. We do not need to reset it.    if (NULL != hSCard)    {        SCardDisconnect(hSCard, SCARD_LEAVE_CARD);    }    // Free resources    if (NULL != pmszCards)    {        SCardFreeMemory(hSC, pmszCards);    }    return lReturn;}LONG MonitorReaders(        __in SCARDCONTEXT hSC){    LPWSTR              pwszReaders = NULL;    LPWSTR              pwszOldReaders = NULL;    LPWSTR              pwszRdr = NULL;    DWORD               dwRet = ERROR_SUCCESS;    DWORD               cchReaders = SCARD_AUTOALLOCATE;    DWORD               dwRdrCount = 0;    DWORD               dwOldRdrCount = 0;    DWORD               dwIndex = 0;    LONG                lReturn = NO_ERROR;    BOOL                fDone = FALSE;    SCARD_READERSTATE   rgscState[MAXIMUM_SMARTCARD_READERS+1] = {0};    SCARD_READERSTATE   rgscOldState[MAXIMUM_SMARTCARD_READERS+1] = {0};    LPSCARD_READERSTATE pRdr = NULL;    // Parameter check    if (NULL == hSC)    {        wprintf(L"Invalid parameter in MonitorReaders.\n");        return ERROR_INVALID_PARAMETER;    }    // One of the entries for monitoring will be to detect new readers    // The first time through the loop will be to detect whether    // the system has any readers.    rgscState[0].szReader = PNP_READER_NAME;    rgscState[0].dwCurrentState = SCARD_STATE_UNAWARE;    dwRdrCount = 1;    while (!fDone)    {        while (!fDone)        {            // Wait for status changes to occur            wprintf(L"Monitoring for changes.\n");            lReturn = SCardGetStatusChange(                                    hSC,                                    INFINITE,                                    rgscState,                                    dwRdrCount);            switch (lReturn)            {                case SCARD_S_SUCCESS:                    // Success                    break;                case SCARD_E_CANCELLED:                    // Monitoring is being cancelled                    wprintf(L"Monitoring cancelled. Exiting.\n");                    fDone = TRUE;                    break;                default:                    // Error occurred                    wprintf(L"Error 0x%x occurred while monitoring reader states.\n", lReturn);                    fDone = TRUE;                    break;            }            if (!fDone)            {                // Examine the status change for each reader, skipping the PnP notification reader                for (dwIndex = 1; dwIndex < dwRdrCount; dwIndex++)                {                    pRdr = &rgscState[dwIndex];                    // Determine if a card is now present in the reader and                    // it can be communicated with.                    if ((pRdr->dwCurrentState & SCARD_STATE_EMPTY ||                         SCARD_STATE_UNAWARE == pRdr->dwCurrentState) &&                        pRdr->dwEventState & SCARD_STATE_PRESENT &&                        !(pRdr->dwEventState & SCARD_STATE_MUTE))                    {                        // A card has been inserted and is available.                        // Grab its ATR for addition to the database.                        wprintf(L"A card has been inserted into reader '%s'. Grabbing its ATR.\n", pRdr->szReader);                        lReturn = ProcessCard(hSC, pRdr);                        // If an error occurs here, we will continue so we can try the next time                        // the card is inserted as well as examine other readers.                    }                    // Save off the new state of the reader                    pRdr->dwCurrentState = pRdr->dwEventState;                }                // Now see if the number of readers in the system has changed.                // Save its new state as the current state for the next loop.                pRdr = &rgscState[0];                pRdr->dwCurrentState = pRdr->dwEventState;                if (pRdr->dwEventState & SCARD_STATE_CHANGED)                {                    wprintf(L"Reader change detected.\n");                    break;                }            }           }        if (!fDone)        {            // Clean up previous loop            if (NULL != pwszOldReaders)            {                SCardFreeMemory(hSC, pwszOldReaders);                pwszOldReaders = NULL;            }            pwszReaders = NULL;            cchReaders = SCARD_AUTOALLOCATE;                        // Save off PnP notification reader state and and list of readers previously found in the system            memcpy_s(&rgscOldState[0], sizeof(SCARD_READERSTATE), &rgscState[0], sizeof(SCARD_READERSTATE));            memset(rgscState, 0, sizeof(rgscState));            dwOldRdrCount = dwRdrCount;            pwszOldReaders = pwszReaders;                        // Obtain a list of all readers in the system            wprintf(L"Building reader list.\n");            lReturn = SCardListReaders(                                hSC,                                NULL,                                (LPWSTR)&pwszReaders,                                &cchReaders);            switch (lReturn)            {                case SCARD_S_SUCCESS:                    // Success                    break;                case SCARD_E_NO_READERS_AVAILABLE:                    // No readers in the system. This is OK.                    lReturn = SCARD_S_SUCCESS;                    break;                default:                    // Error occurred                    wprintf(L"Failed to obtain list of readers with error 0x%x.\n", lReturn);                    fDone = TRUE;                    break;            }            // Build the reader list for monitoring - NULL indicates end-of-list            // First entry is the PnP Notification entry.            pRdr = rgscState;            memcpy_s(&rgscState[0], sizeof(SCARD_READERSTATE), &rgscOldState[0], sizeof(SCARD_READERSTATE));            pRdr++;            pwszRdr = pwszReaders;            while ((NULL != pwszRdr) && (0 != *pwszRdr))            {                BOOL fFound = FALSE;                dwRdrCount++;                // Look for an existing reader state from a previous loop                for (dwIndex = 1; dwIndex < dwOldRdrCount; dwIndex++)                {                    if ((lstrlen(pwszRdr) == lstrlen(rgscOldState[dwIndex].szReader)) &&                        (0 == lstrcmpi(pwszRdr, rgscOldState[dwIndex].szReader)))                    {                        // Found a match. Copy it.                        memcpy_s(pRdr, sizeof(SCARD_READERSTATE), &rgscOldState[dwIndex], sizeof(SCARD_READERSTATE));                        fFound = TRUE;                        break;                    }                }                if (!fFound)                {                    // New reader                    pRdr->szReader = pwszRdr;                    pRdr->dwCurrentState = SCARD_STATE_UNAWARE;                }                // Increment reader indices                pRdr++;                pwszRdr += lstrlen(pwszRdr)+1;            }        }    }    // Clean up resources    if (NULL != pwszReaders)    {        SCardFreeMemory(hSC, pwszReaders);    }    if (NULL != pwszOldReaders)    {        SCardFreeMemory(hSC, pwszOldReaders);    }    return lReturn;}LONG __cdecl main(        VOID){    DWORD               dwRet = ERROR_SUCCESS;    SCARDCONTEXT        hSC = NULL;    LONG                lReturn = NO_ERROR;    HANDLE              hStartedEvent = NULL;    // Get handle to event that will be signaled when the Smart Card Service is available    hStartedEvent = SCardAccessStartedEvent();    // Wait for the Smart Card Service to become available    dwRet = WaitForSingleObject(hStartedEvent, INFINITE);    if (WAIT_OBJECT_0 != dwRet)    {        wprintf(L"Wait for Smart Card Service failed with error 0x%x.\n", dwRet);        lReturn = dwRet;    }    else    {        // Establish a system-level context with the Smart Card Service        lReturn = SCardEstablishContext(                                SCARD_SCOPE_SYSTEM,                                NULL,                                NULL,                                &hSC);        if (SCARD_S_SUCCESS != lReturn)        {            wprintf(L"Failed to establish context with the Smart Card Service with error 0x%x.\n", lReturn);        }        else        {            // Begin monitoring the readers in the system            // This routine could be done in a separate thread so it can be cancelled via SCardCancel().            lReturn = MonitorReaders(hSC);        }    }       // Cleanup resources    if (NULL != hSC)    {        SCardReleaseContext(hSC);    }    if (NULL != hStartedEvent)    {        SCardReleaseStartedEvent();    }    wprintf(L"Done.\n");    return lReturn;}
関連情報
スマート カードのプラグ アンド プレイに関する問題のトラブルシューティングの詳細については、次の TechNet の記事を参照してください。
スマート カードのプラグ アンド プレイがトラブルシューティング ガイド
http://technet.microsoft.com/en-us/library/dd979536 (WS.10).aspx
PnP ように win7 win2008R2 のスマート カード

警告: この記事は自動翻訳されています

プロパティ

文書番号:976832 - 最終更新日: 06/11/2016 19:33:00 - リビジョン: 9.0

Windows Server 2008 R2 Datacenter, Windows Server 2008 R2 Enterprise, Windows Server 2008 R2 Standard, Windows 7 Enterprise, Windows 7 Home Basic, Windows 7 Home Premium, Windows 7 Professional, Windows 7 Starter, Windows 7 Ultimate

  • kbsmartcard kbcodesnippet kbtshoot kbexpertiseinter kbsurveynew kbprb kbmt KB976832 KbMtja
フィードバック
d(m);