セキュリティ対策として、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 キーを押します。マシン A で RDP を入力し、すぐに切断して Enter キーを押すこともできます。
C では、SCardReleaseContext と SCardEstablishContext ( ref ) を使用します。Java API を介してこれを行う方法はありますか?
ファローアップ
AFAICTこれは不可能です。ただし、リンク、リンクを参照してください。サーバーでスマートカードのリダイレクトを無効にして、問題を回避できるはずです。
Win7 Pro では、gpedit.msc に「コンピューターの構成/管理用テンプレート/Windows コンポーネント/リモート デスクトップ サービス/リモート デスクトップ セッション ホスト/デバイスとリソースのリダイレクト/スマート カード デバイスのリダイレクトを許可しない」という設定が見つかりました。つまり、私はこれをまだ機能させていません。接続前に RDP クライアントの「スマートカードを転送する」チェックボックスをオフにしても効果はありません。