作爲一項安全措施,Windows將本地智能卡讀卡器轉發給遠程機器。問題是,RDP永久終止TerminalFactory
- 讀者你已經有把手,變得不可用
- 這是不可能獲得新的讀者
如果您嘗試使用終端或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上的代碼,RDP使用機器B,然後回車。你甚至可以在RDP中,立即斷開連接,並在機器A上輸入命令。
在C中,我將使用SCardReleaseContext和SCardEstablishContext(ref)。有沒有什麼辦法通過Java API來實現這一點?
跟進
AFAICT這是不可能的。但請參閱link,link。應該可以禁用服務器上的智能卡重定向,從而避免出現問題。
在Win7 Pro上,我發現了gpedit.msc中的設置:「計算機配置/管理模板/ Windows組件/遠程桌面服務/遠程桌面會話主機/設備和資源重定向/不允許智能卡設備重定向」。這就是說我還沒有這個工作。即使在連接之前取消選中RDP客戶端中的「前進智能卡」複選框也無濟於事。
也許發佈該解決方法作爲答案,所以你可以接受它。你可以隨時改變接受,如果一個更好的答案提升(你可以希望,不是嗎?) –