В качестве меры безопасности 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, RDP на машине B и нажмите Enter. Вы даже можете подключиться к RDP, немедленно отключиться и нажать Enter на машине A.
В C я бы использовал SCardReleaseContext и SCardEstablishContext (ref а>). Есть ли способ сделать это через Java API?
Последующие действия
ПОКА это невозможно. Однако см. ссылку, ссылка. Должна быть возможность отключить перенаправление смарт-карт на сервере, чтобы обойти проблему.
В Win7 Pro я нашел параметр в gpedit.msc: «Конфигурация компьютера/Административные шаблоны/Компоненты Windows/Службы удаленных рабочих столов/Узел сеансов удаленных рабочих столов/Перенаправление устройств и ресурсов/Не разрешать перенаправление устройств со смарт-картами». Тем не менее, у меня это еще не работает. Даже снятие флажка «пересылать смарт-карты» в RDP-клиенте перед подключением не помогает.