2012-06-25 82 views
1

作爲一項安全措施,Windows將本地智能卡讀卡器轉發給遠程機器。問題是,RDP永久終止TerminalFactory

  1. 讀者你已經有把手,變得不可用
  2. 這是不可能獲得新的讀者

如果您嘗試使用終端或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這是不可能的。但請參閱linklink。應該可以禁用服務器上的智能卡重定向,從而避免出現問題。

在Win7 Pro上,我發現了gpedit.msc中的設置:「計算機配置/管理模板/ Windows組件/遠程桌面服務/遠程桌面會話主機/設備和資源重定向/不允許智能卡設備重定向」。這就是說我還沒有這個工作。即使在連接之前取消選中RDP客戶端中的「前進智能卡」複選框也無濟於事。

+0

也許發佈該解決方法作爲答案,所以你可以接受它。你可以隨時改變接受,如果一個更好的答案提升(你可以希望,不是嗎?) –

回答

0

這只是一個問題,如果你的RDP與使用閱讀器的用戶相同。我們通過使用ObjectWeb中的JavaService.exe運行服務器來繞過它,以「本地系統」用戶身份運行。