作为一种安全措施,Windows 将本地智能卡读卡器转发到远程机器。问题是
- 您已经拥有句柄的阅读器变得无法使用
- 不可能获得新读者
如果您尝试使用终端或 CardTerminals 对象,则会收到 PCSCException:SCARD_E_SERVICE_STOPPED。
我有代码来演示这个问题:
import javax.smartcardio.*;
public class ScRdp {
public static void main( final String[] args ) throws Exception
{
TerminalFactory factory = TerminalFactory.getDefault();
System.out.println( "Factory: " + factory.hashCode() );
final CardTerminals terminals = factory.terminals();
List<CardTerminal> termNames = terminals.list();
BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) );
in.readLine();
main( args );
}
}
在机器 A 上启动代码,使用机器 B 中的 RDP,然后按 Enter。您甚至可以 RDP 进入,立即断开连接并在机器 A 上按 Enter。
在 C 语言中,我会使用 SCardReleaseContext 和 SCardEstablishContext ( ref )。有没有办法通过 Java API 做到这一点?
跟进
AFAICT这是不可能的。但是请参阅链接,链接。应该可以在服务器上禁用智能卡重定向,从而规避问题。
在 Win7 Pro 上,我在 gpedit.msc 中找到了设置:“计算机配置/管理模板/Windows 组件/远程桌面服务/远程桌面会话主机/设备和资源重定向/不允许智能卡设备重定向”。那就是说我还没有这个工作。即使在连接之前取消选中 RDP 客户端中的“转发智能卡”复选框也无济于事。