2012-06-25 2 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); 
} 
} 

Запустите код на машине А, RDP в использовании машины B и нажмите клавишу ВВОД. Вы можете даже включить RDP, немедленно отключить и нажать enter на машине A.

В C я использовал бы SCardReleaseContext и SCardEstablishContext (ref). Есть ли способ сделать это через Java API?

Followup

AFAICT это не представляется возможным. Однако см. link, link. Должно быть возможно отключить перенаправление смарт-карт на сервере, обойдя проблему.

На Win7 Pro Я нашел параметр в gpedit.msc: «Конфигурация компьютера/Административные шаблоны/Компоненты Windows/Службы удаленных рабочих столов/Узел сеанса удаленных рабочих столов/Перенаправление устройств и ресурсов/Не разрешать перенаправление устройства смарт-карты». Тем не менее, у меня пока нет этой работы. Даже снятие флажка «forward smartcards» в клиенте RDP до того, как соединение не поможет.

+0

Возможно, это обходное решение как ответ, чтобы вы могли его принять. Вы всегда можете изменить принятие, если лучший ответ будет полезен (вы можете надеяться, не так ли?) –

ответ

0

Это только проблема, если вы используете RDP в качестве того же пользователя, что и у читателей. Мы обошли его, запустив сервер с помощью JavaService.exe из ObjectWeb для запуска в качестве пользователя «Local System».

Смежные вопросы