首次尝试无法访问智能卡,任何其他都成功

Posted

技术标签:

【中文标题】首次尝试无法访问智能卡,任何其他都成功【英文标题】:Cannot access Smart Card at first attempt, any other is successful 【发布时间】:2016-02-02 11:55:16 【问题描述】:

PCSC 读卡器和智能卡有问题。我无法使用我的 GUI 应用程序访问该卡。它在控制台示例应用程序中就像一个魅力。 我收到异常:

SCard.Connect Error 0x8010000B: The smart card cannot be accessed because of other connections outstanding!
A first chance exception of type 'GS.SCard.WinSCardException' occurred in GS.CSharpPCSC.dll

但是当我取出卡并重新插入时,它工作正常。 我认为在插入时我的 Windows 机器中的其他进程可以访问该卡,所以我创建了一个 while,当 ret 值等于 WinSCardException 中的 -2146435061continue 循环,或break 如果连接正常。 连接卡的步骤:

PCSCReader reader = new PCSCReader();
string[] readers = reader.SCard.ListReaders(); 
// Returns 3 readers (even though I have 2 connected, but when I once connected the third one it now appears always) - why?
// Here with GUI I choose interested reader (which is really connected)
reader.SCard.ReleaseContext();
reader.Disconnect(); // In case there is any reader connected
// Here I stop my worker so that It will not try to access reader when it is not connected
reader.Connect(readers[1]); // For example let's connect to reader 1
// Now the worker starts working

//...DoWork method of worker:
while(true)

  try reader.ActivateCard(); break; // break if successfully connected
  // If the ex status is positive then there is some other issue which is handled by bigger try-catch, but for case ret is -2146435061 i want to continue the loop
  catch (WinSCardException ex) if (ex.Status > -100) throw (ex); 
  // But this throw Exception over and over again

需要帮助。 我使用这个包装器:http://www.smartcard-magic.net/en/pc-sc-reader/csharppcsc-wrapper/ 示例程序看起来几乎相同,但不会抛出任何错误。

using System;
using System.Diagnostics;
using GS.Apdu;
using GS.PCSC;
using GS.SCard;
using GS.SCard.Const;
using GS.Util.Hex;

namespace ExamplePCSCReader

    class Program
    
        static void Main( string[] args )
        
            ConsoleTraceListener consoleTraceListener = new ConsoleTraceListener();
            Trace.Listeners.Add(consoleTraceListener);

            PCSCReader reader = new PCSCReader();

            try
            
                reader.Connect();
                reader.ActivateCard();

                RespApdu respApdu = reader.Exchange("00 B0 00 00 0A"); // Get Card UID ...
                if (respApdu.SW1SW2 == 0x9000)
                
                    Console.WriteLine("ICCID  = 0x" + HexFormatting.ToHexString(respApdu.Data, true));
                
            
            catch (WinSCardException ex)
            
                Console.WriteLine( ex.WinSCardFunctionName + " Error 0x" + 
                                   ex.Status.ToString( "X08" ) + ": " + ex.Message );
            
            catch (Exception ex)
            
                Console.WriteLine( ex.Message );
            
            finally
            
                reader.Disconnect();
                Console.WriteLine( "Please press any key..." );
                Console.ReadLine();
            
        
    


【问题讨论】:

尝试直接使用 Winscard.dll 中的“SCardConnect”函数和“SCARD_SHARE_EXCLUSIVE”。对于 c# 签名转到链接pinvoke.net/default.aspx/winscard.scardconnect 谢谢,辛苦了!但是列表阅读器仍然存在问题。它仍然返回 3 个读者。 您使用的是哪个阅读器? Gemplus USB 智能卡读卡器 我的应用程序返回:Reader 0: Broadcom Corp Contacted SmartCard 0..... Reader 1: Gemplus USB Smart Card Reader 0 ..... Reader 2: Gemplus USB Smart Card Reader 1 当示例程序仅返回阅读器 0 和阅读器 1 并且它们已连接时 【参考方案1】:

关于访问 reader 的问题 - 解决方法是通过命令共享 reader:

reader.ActivateCard(GS.SCard.Const.SCARD_SHARE_MODE.Shared, GS.SCard.Const.SCARD_PROTOCOL.Tx);

列出现有阅读器的问题是,如果没有建立上下文,包装器会从 Windows 注册表中获取阅读器列表。当我在列出读者之前建立上下文时 - 只有连接的读者才会出现。

reader.SCard.EstablishContext();
readers = reader.SCard.ListReaders();

【讨论】:

【参考方案2】:

我和你有同样的问题......但我找到了解决方案。

从 SCardShareMode.Exclusive 更改为 > SCardShareMode.Shared

            _hContext = new SCardContext();
            _hContext.Establish(SCardScope.System);

            // Create a _reader object using the existing context
            _reader = new SCardReader(_hContext);

            // Connect to the card
            if (readerName == null || readerName == String.Empty)
            
                // Retrieve the list of Smartcard _readers
                string[] szReaders = _hContext.GetReaders();
                if (szReaders.Length <= 0)
                    throw new PCSCException(SCardError.NoReadersAvailable,
                        "Could not find any Smartcard _reader.");

                _err = _reader.Connect(szReaders[0],
                            SCardShareMode.Shared,
                            SCardProtocol.T0 | SCardProtocol.T1);
                CheckErr(_err);
             

【讨论】:

【参考方案3】:

我知道这个主题很老,但它可能会帮助其他将来面临这个问题的人。共享阅读器是一种解决方法,而不是解决方法。事实上,由于其他连接未完成,无法以独占模式进行连接这一事实意味着 Windows 进程正在应用程序之外的智能卡上执行操作。 这可能会导致您的应用程序访问智能卡时出现问题,尤其是在同时使用多个读卡器/卡时。​​p>

真正的解决方法是在 Windows 机器上工作时更改组策略编辑器中的一些配置。它应该如下所示:

然后读卡器应该能够以独占或直接模式连接到卡

干杯

【讨论】:

以上是关于首次尝试无法访问智能卡,任何其他都成功的主要内容,如果未能解决你的问题,请参考以下文章

管理员链接显示 404 WordPress

XAMPP:无法从智能手机(iPhone)加载访问 url 的资源

为啥我的 Mapbox GL JS 地图在通过 Turbolinks 首次访问时无法正确显示?

访问报告大小无法控制!

其他用户无法访问 docker 中的 mariadb,然后是 root

win10无法访问win7以上系统的共享,可以访问XP的共享