Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 应用程序使用智能卡读卡器与RDP和交换用户_Windows_Smartcard_Rdp - Fatal编程技术网

Windows 应用程序使用智能卡读卡器与RDP和交换用户

Windows 应用程序使用智能卡读卡器与RDP和交换用户,windows,smartcard,rdp,Windows,Smartcard,Rdp,一个windows应用程序与智能卡读卡器配合使用。它有这样的循环: do{ lErr = SCardListReaders( hContext, ... ); if ( lErr != SCARD_S_SUCCESS ) return 1; //Show readers }while(!stop) i、 它获取当前的读者列表,然后显示。 问题是,这在RDP连接中无法正常工作。假设我们有带智能卡读卡器A(读卡器A)的计算机A(COMP_A),带读卡器B(读卡器B)的计算机B(COMP_B

一个windows应用程序与智能卡读卡器配合使用。它有这样的循环:

do{
lErr = SCardListReaders( hContext, ... );
if ( lErr != SCARD_S_SUCCESS )
    return 1;
//Show readers
}while(!stop)
i、 它获取当前的读者列表,然后显示。 问题是,这在
RDP
连接中无法正常工作。假设我们有带智能卡读卡器A(读卡器A)的计算机A(COMP_A),带读卡器B(读卡器B)的计算机B(COMP_B)。该应用程序在COMP_A上启动,并在读卡器列表中显示读卡器A。然后我们通过
RDP从COMP_B连接到COMP_A。
正确的结果必须是列表中有READER_B。但是应用程序“崩溃”,因为
SCardListReaders
返回
SCARD\u E\u服务已停止。
一些人目瞪口呆地回答说,我们需要重新建立上下文。因此,新版本的循环:

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。我想是因为新的
scardesttablishcontext
在RDP连接最终设置之前就结束了。至少,如果睡眠没有注释,它是正确的。 用户切换时的类似情况,即当用户选择“切换用户”时,
scaddlistreaders
返回
SCARD\u e\u SERVICE\u STOPPED

问题是如何生成正确的代码?如何确定这是RDP连接还是用户切换?如何重新建立scard上下文?


实际上,我做了一些更改,使用了带有
WTSClientProtocolType
参数的
WTSQuerySessionInformation
函数。我在
WTSClientProtocolType=2
时等待,然后调用
scardesttablishcontext
。但我不确定这是正确的,而且对于切换用户也是不正确的。< /P>请提供完整的源代码,参数有时会对(例如系统或用户上下文)测试VisualStudio C++ 2008项目在这里。单击“ScardestStablishContext”,“运行线程”。这将启动显示读卡器列表的线程。在“运行线程”之前选中“睡眠”复选框,以便在重新建立上下文之前启用睡眠(10000)。