2015-05-21 16 views
18

Ich habe eine Anwendung, die einen Chipkartenleser verwendet, damit die Benutzer auf Teile des Systems zugreifen können. An einem Ort habe ich keine Probleme. Aber eine andere, die eine andere Art von Kartenhersteller haben, hat eine Menge Probleme. Es erhält immer wieder eine ID von Null. Dann schaut in die eventlog habe ich diesen: enter image description here Und das ist der Code:Chipkartenleser, kann einige Karten nicht lesen

card.Connect(reader, SHARE.Shared, PROTOCOL.T0orT1); 

var apduGetID = new APDUCommand(0xFF, 0xCA, 0, 0, null, 4); 
var apduRespGetID = card.Transmit(apduGetID); 
long cardId = BitConverter.ToUInt32(apduRespGetID.Data.Reverse().ToArray(), 0); 

das zweite Problem besteht darin, dass dann versuchen, den Code zu debuggen, es funktioniert perfekt, nur dann den Haltepunkt entferne ich das sehen kann Problem aber nicht wo. Kann mir bitte jemand helfen?

P.S. Ich habe diesen Thread, aber es funktioniert nicht: https://superuser.com/questions/715688/smart-card-errors

Update: Hier ist die Sende Klasse sind

public override APDUResponse Transmit(APDUCommand ApduCmd) 
     { 
      var RecvLength = (uint)(ApduCmd.Le + APDUResponse.SW_LENGTH); 
      byte[] ApduBuffer; 
      var ApduResponse = new byte[ApduCmd.Le + APDUResponse.SW_LENGTH]; 
      var ioRequest = new SCard_IO_Request 
      { 
       m_dwProtocol = m_nProtocol, 
       m_cbPciLength = 8 
      }; 

      // Build the command APDU 
      if (ApduCmd.Data == null) 
      { 
       ApduBuffer = new byte[APDUCommand.APDU_MIN_LENGTH + ((ApduCmd.Le != 0) ? 1 : 0)]; 

       if (ApduCmd.Le != 0) 
       { 
        ApduBuffer[4] = ApduCmd.Le; 
       } 
      } 
      else 
      { 
       ApduBuffer = new byte[APDUCommand.APDU_MIN_LENGTH + 1 + ApduCmd.Data.Length]; 

       for (var nI = 0; nI < ApduCmd.Data.Length; nI++) 
       { 
        ApduBuffer[APDUCommand.APDU_MIN_LENGTH + 1 + nI] = ApduCmd.Data[nI]; 
       } 

       ApduBuffer[APDUCommand.APDU_MIN_LENGTH] = (byte)ApduCmd.Data.Length; 
      } 

      ApduBuffer[0] = ApduCmd.Class; 
      ApduBuffer[1] = ApduCmd.Ins; 
      ApduBuffer[2] = ApduCmd.P1; 
      ApduBuffer[3] = ApduCmd.P2; 

      m_nLastError = SCardTransmit(m_hCard, ref ioRequest, ApduBuffer, (uint)ApduBuffer.Length, IntPtr.Zero, ApduResponse, out RecvLength); 

      if (m_nLastError != 0) 
      { 
       var msg = "SCardTransmit error: " + m_nLastError; 
       throw new SmartCardException(msg, m_nLastError); 
      } 

      var apduData = new byte[RecvLength]; 

      for (var nI = 0; nI < RecvLength; nI++) 
      { 
       apduData[nI] = ApduResponse[nI]; 
      } 

      return new APDUResponse(apduData); 
     } 

Update 2: Ich mit auch versucht haben, einige Thread.Sleep zu setzen()

+0

Was macht "card.Transmit"? Das heißt, was ist die tatsächliche Antwort von dem Kartenleser oder der Karte? Mit welcher Art von Karte arbeiten Sie? –

+1

Können Sie etwas Verzögerung zwischen Ihrem Befehl und versuchen Sie es erneut? Kann der Leser oder die Karte nicht so schnell wie Ihre Programmlaufzeit sein? – Abraham

+0

Haben Sie selbst das Programm geschrieben, das auf den Smartcards installiert ist? Kannst du '00A404000004' an beide Arten von Karten senden und die Antwort der Karten zu der Frage hinzufügen? (Verwenden Sie dieses Tool, um APDU-Befehle an die Karten zu senden: https://github.com/OpenSC/OpenSC/wiki) – Abraham

Antwort

3

Bitte überprüfen Sie, dass auf der zweiten Maschine alle aktuellen Treiber der Smartcard vorhanden sind. Manchmal hilft es auch, den vom Hersteller bereitgestellten Treiber durch den "Microsoft WUDF-Treiber" zu ersetzen - https://msdn.microsoft.com/en-us/library/windows/hardware/dn653571(v=vs.85).aspx

Bitte beachten Sie, dass das Betriebssystem zwei Arten von Geräten erkennt, wenn Sie es einstecken - die Smartcard Enumerator-Gerät (Chipkartenleser) und die Smartcard (manchmal Smartcard-Container genannt) selbst. Ein Chipkartenleser kann mehrere Smartcards enthalten.

Beispiel der Smart-Card, die Fahrer kräftig mit Microsoft WUDF ersetzt wurden die Client-Anwendung (iBank2) Arbeit zu machen:

four smart cards WUDF type

Die vier Smart-Card-Fahrer haben mit grundlegendem Microsoft-Treiber mit Nachdruck ersetzt worden Machen Sie die Anwendung funktionieren.

0

Nun, wenn das andere System Ihre Smartcard nicht akzeptiert, überprüfen Sie einfach die BIOS Einstellungen für Smartcard.Es gibt eine Option zu deaktivieren/aktivieren sie in einigen Systemen.