Fehlermeldung, wenn eine Smartcard in ein Lesegerät ein, auf dem Windows 7 oder Windows Server 2008 R2-basierten einfügen: "die Gerätetreibersoftware wurde nicht installiert"

Wichtig: Dieser Artikel wurde maschinell übersetzt und wird dann möglicherweise mithilfe des Community Translation Framework (CTF) von Mitgliedern unserer Microsoft Community nachbearbeitet. Weitere Informationen zu CTF finden Sie unter http://support.microsoft.com/gp/machine-translation-corrections/de.

Den englischen Originalartikel können Sie über folgenden Link abrufen: 976832
Problembeschreibung
Beim Einlegen einer Smartcards in einen Smartcard-Leser versucht Windows herunterladen und Installieren der Smartcard Minidrivers für die Karte über Plug & Play-Services. Wenn der Treiber für die Smartcard nicht verfügbar an vorkonfigurierten Standorten wie Windows Update, WSUS oder Intranet Pfade und benutzerdefinierte Kryptografiedienstanbieter noch nicht auf dem System installiert ist, erhalten Sie folgende Fehlermeldung im Infobereich:
Die Gerätetreibersoftware wurde nicht erfolgreich installiert.
Klicken Sie hier, um weitere Informationen zu erhalten.
Diese Fehlermeldung wird nach einigen Sekunden ausgeblendet.

Darüber hinaus hat im Geräte-Manager unter andere Geräte, das Smartcard-Gerät Status "Ausfall" (Treiber nicht gefunden)

Dies erfordert häufig den Benutzer eines der folgenden Elemente von Smartcard Aussteller zur Behebung dieses Fehlers:
  1. Ein Smartcard-Minitreiber mit Windows-Logo
  2. Ein benutzerdefinierter Kryptografiedienstanbieter (CSP) für die Smartcard.
  3. Ein Windows-located Smartcard Minitreiber
  4. Anderer Middleware wie ein ActiveX-Steuerelement, PKCS #11-Software oder andere benutzerdefinierte Software.
Wenn der Benutzer mit nur 3 oder 4 in der Liste angegeben ist, weiterhin die Smartcard im System arbeiten. Jedoch erhalten der Benutzer die Fehlermeldung, die in diesem Abschnitt jedes Mal erwähnt wird, dass sie die Smartcard einlegen.

Dieses Problem betrifft alle Versionen von Windows 7, Windows Server 2008 R2 und in späteren Versionen von beiden Betriebssystemen.
Ursache
Alle Smartcards benötigen zusätzlichen Software, um in Windows zu funktionieren, sofern kein vorhandener Treiber es dem Benutzer ermöglicht, die Karte zu verwenden, ohne zusätzliche Software zu installieren. In Windows 7 ermöglichen das automatische Herunterladen Smartcard Minidrivers über Windows Update oder ähnliche Orte wie einen WSUS-Server Wenn die Smartcard in den Leser eingelegt wurde Windows Smartcard Framework verbessert. Alle Smartcards, die erfolgreich an Logo vom Windows Logo Program profitieren von dieser Funktion.

Wenn die Software, die erforderlich ist, verwenden Sie eine Smartcard in Windows nicht verteilen oder einen Typ, der eine Minitreiber wie PKCS #11, eine benutzerdefinierte CSP, Middleware, oder ein ActiveX-Steuerelement unterscheidet das automatische Herunterladen Option fehlschlägt da Microsoft nur Smartcard Minidrivers zertifiziert Daher, wenn der Benutzer eine Karte die benutzerdefinierte CSP nicht registriert ist fügt, erhält der Benutzer eine Fehlermeldung, die besagt, dass die Treibersoftware für das Smartcard-Gerät fehlt, obwohl der Benutzer die Smartcard durch zusätzliche Software verwenden kann, die auf dem Computer des Benutzers von einer benutzerdefinierten Installation installiert wurde.
Lösung
Obwohl die Smartcards trotz der Fehlermeldung weiterhin, die angezeigt wird, können eine Smartcard Emittenten, Anbieter oder Hersteller eine der folgenden Methoden zur Behebung dieses Fehlers.

Implementieren einer Smartcard-Minitreiber

Wir empfehlen Kreditkartenanbieter, Kreditoren und Herstellern Smartcard Minidrivers implementieren und Teilnahme an Windows Logo Program Verbesserungen profitieren, die in der Plattform wie Smartcards Plulay Device Stage für Smartcards eingeführt werden und so weiter.

Weitere Informationen zu Smartcard Minitreiber Spezifikationen für Windows finden Sie auf der folgenden Microsoft-Website: Weitere Informationen zum Einstieg beim Abrufen eines Logos für Ihre Smartcard Minidrivers finden Sie auf der folgenden Windows Logo Program-Website:

Implementieren eines NULL-Treibers für Ihre Smartcard

Benutzerdefinierte Software solchen PKCS #11-Treiber, ein ActiveX-Steuerelement oder anderer Middleware Smartcard auf Windows aktivieren muss und Implementieren einer Smartcard-Minitreiber oder eine benutzerdefinierte CSP ist keine praktische Option sollten halte Kreditkartenanbieter, Lieferanten oder Hersteller senden NULL-Treiber auf Windows Update. Dafür ist ein NULL-Treiber über Windows Update verfügbar muss normalerweise eine erfolgreiche nicht klassifiziertes Gerät senden über Winqual. Liegt in der Zukunft eine Minitreiber für diese Karten verfügbar, kann der neue Treiber an das Windows-Logo-Programm Windows Update hochgeladen werden. NULL-Treiber dann manuell heruntergeladen werden durch den Endbenutzer oder über optionale Updates verfügbar gemacht.

Folgendes ist eine Beispielvorlage für eine NULL-Treiber für eine Smartcard.
;; 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"
Zum Generieren der Hardware-Geräte-ID, die durch die Zeichenfolge DEVICE_ID im Beispiel Anweisungen der Smartcard Minitreiber Spezifikation. Zu diesem Zweck besuchen Sie die folgende Microsoft-Website:

Detaillierte Informationen zum NULL-Treiber an Microsoft übermitteln wenden Sie sich an Microsoft Product Support Services.

Deaktivieren Sie Smartcard Plug &amp; Play über Gruppenrichtlinien für verwaltete Computer

Diese Option empfiehlt sich nur für Installationen, in denen Computer verwaltet werden, Administratoren und die erforderliche Software für Smartcards, die im Unternehmen verwendet werden mit Software-Management-Tools wie SMS installiert ist.

Dieses Verfahren wird nicht empfohlen, in den folgenden da Smartcards in Ihrer Umgebung auswirkt:
  • Kommerzielle Bereitstellung, die Endbenutzer wie online-banking
  • Umgebungen, die sowohl Play Plug &amp;-Karten und Plug &amp; Play - Smartcards, die Gruppenrichtlinien verwenden, um Plug &amp; Play für Smartcards deaktivieren
Smartcard Plug &amp; Play kann in Unternehmen vollständig deaktiviert werden, in dem Computer des Endbenutzers wie Gruppenrichtlinien verwaltet.

Wenn die Bereitstellung nur Plug &amp; Play - Smartcard-Lösungen, kann durch einen lokalen Administrator auf einem Clientcomputer Smartcard Plug &amp; Play deaktiviert. Deaktivieren der Smartcard Plug &amp; Play kann auch Smartcard Minidrivers Smartcard-Treiber downloaden. Es verhindert auch Smart Card Plug And Play aufgefordert.

Gehen Sie folgendermaßen vor, um Smartcard Plug &amp; Play in der lokalen Gruppenrichtlinie zu deaktivieren:
  1. Klicken Sie auf Start, Typ gpedit.msc im Feld Programme / Dateien durchsuchen und drücken die EINGABETASTE.
  2. Klicken Sie in der Konsolenstruktur unter Computerkonfigurationauf Administrative Vorlagen.
  3. Doppelklicken Sie im Detailfenster auf Windows-Komponenten, und doppelklicken Sie auf Smartcard.
  4. Mit der rechten Maustaste auf Smartcard Plug &amp; Play-Dienst aktivierenund dann auf Bearbeiten.
  5. Klicken Sie auf deaktiviert, und klicken Sie auf OK.

Ändern Sie des Endbenutzers und deaktivieren Smartcard Plug &amp; Play für bestimmte Karten

Dies ist die am wenigsten empfohlene Option. Sie sollten diese Option nur, wenn die Karten ältere können und es nicht geplant ist, in Zukunft Smartcard Minidrivers implementieren. Diese Option erfordert, dass die vorhandene Software auf dem System installiert benachrichtigt Windows gibt eine benutzerdefinierte CSP auf dem System installiert, obwohl kein CSP auf Endbenutzer-System vorhanden ist. Sobald Windows feststellt, dass eine benutzerdefinierte CSP auf dem System installiert ist, versucht Windows nicht herunterladen und Installieren über Smartcard Plug &amp; Play. Kein Geräteknoten für den Smartcard-Gerät erstellt, die im Geräte-Manager angezeigt. Diese Option führt die folgenden Änderungen Registrierung:

Unterschlüssel:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Calais\SmartCards\<Smart card name>
Unterschlüssel Registrierungseinträge:
  • ATR = hexadezimalen DWORD: Kommatrennzeichen ATR der Smartcard.
  • ATRMask = hexadezimalen DWORD: Kommatrennzeichen Maske zum Maskieren unbedeutend Bytes im ATR ATR zuweisen.
  • Kryptografieanbieter = Zeichenfolge: eine Zeichenfolge für die Smartcard.
Beispiel:
Unterschlüssel:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Calais\SmartCards\Fabrikam ATM card
Unterschlüssel Registrierungseinträge:
  • ATR = hexadezimalen DWORD: 3, dc, 13 00, 40, 3a, 49, 54, 47, 5f, 4D, 53, 43, 50, 53 5f, 56, 32
  • ATRMask = hexadezimalen DWORD: ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff
  • Kryptografieanbieter = Zeichenfolge: "Fabrikam ATM Dummy Provider"
X64-Bit-Systeme müssen identische unter dem folgenden Unterschlüssel geändert werden:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Cryptography\Calais\SmartCards


Es wird empfohlen, anstelle die Registrierung ändern, Sie Winscard-APIs verwenden diese Änderungen auf das System. Hier ist Code-Beispiel, das Einlegen der Smartcard erkennt und erstellen einen Registrierungseintrag, die Karte mit einem nicht vorhandenen Anbieter Smartcard Plug &amp; Play für die Karte deaktiviert.

Microsoft bietet Programmierbeispiele lediglich zur Veranschaulichung, ohne ausdrückliche oder konkludente Gewährleistung. Dies beinhaltet, ist jedoch nicht beschränkt auf, konkludente Gewährleistungen der Tauglichkeit oder Eignung für einen bestimmten Zweck. Dieser Artikel setzt voraus, dass Sie mit der von Beispielen verwendeten Programmiersprache und den Tools, die zum Erstellen und Debuggen von Prozeduren verwendet werden, vertraut sind. Microsoft-Supporttechniker helfen der Erläuterung der Funktionalität bestimmter Prozeduren. Allerdings werden sie diese Beispiele nicht ändern, um zusätzliche Funktionalität bereitzustellen oder Prozeduren erstellen, die Ihren spezifischen Bedürfnisse erfüllen.
//==============================================================;////  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;}
Informationsquellen
Weitere Informationen zur Problembehandlung bei der Smartcard-Plug &amp; Play finden Sie im folgenden TechNet-Artikel:
PnP-Plugnplay win7 win2008R2 smartcard

Warnung: Dieser Artikel wurde automatisch übersetzt.

Eigenschaften

Artikelnummer: 976832 – Letzte Überarbeitung: 06/11/2016 04:51:00 – Revision: 5.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 KbMtde
Feedback