使用智能卡读卡器与RDP和切换用户的应用程序

时间:2013-04-18 12:05:55

标签: windows smartcard rdp

一个Windows应用程序适用于智能卡读卡器。它有这样的循环:

do{
lErr = SCardListReaders( hContext, ... );
if ( lErr != SCARD_S_SUCCESS )
    return 1;
//Show readers
}while(!stop)

即。它获取当前的读者列表,而不是显示它。 问题是这与RDP连接无关。假设我们的计算机A(COMP_A)带有智能卡读卡器A(READER_A),计算机B(COMP_B)带有读卡器B(READER_B)。该应用程序在COMP_A上启动,并在读者列表中显示READER_A。然后我们通过RDP.从COMP_B连接到COMP_A。正确的结果必须是列表中有READER_B。但应用程序“崩溃”,因为SCardListReaders返回SCARD_E_SERVICE_STOPPED. 一些瞪眼回答我们需要重新建立背景。所以循环的新版本:

do{
lErr = SCardListReaders( hContext, ... );
if ( lErr == SCARD_E_SERVICE_STOPPED )
{
    SCardReleaseContext( hContext );
    //Sleep(10000)
    SCardEstablishContext( ..., &hContext );
    lErr = SCardListReaders( hContext, ... );
}
if ( lErr != SCARD_S_SUCCESS )
    return 1;
//Show readers
}while(!stop)

它不起作用,SCardListReaders在列表中返回READER_A。我想因为新的SCardEstablishContext在最终设置RDP连接之前结束。至少如果Sleep被取消注释,它的工作正常。 当用户选择“切换用户”时,用户切换的类似情况即SCardListReaders返回SCARD_E_SERVICE_STOPPED

问题是如何制作正确的代码?如何确定这是RDP连接还是用户切换?如何重新建立scard context?

实际上我做了一些使用WTSQuerySessionInformation函数和WTSClientProtocolType参数的更改。我在WTSClientProtocolType = 2等待,然后致电SCardEstablishContext。但我不确定这是否正确,也不适合切换用户。

0 个答案:

没有答案