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