RDP навсегда убивает TerminalFactory

В качестве меры безопасности Windows перенаправляет локальные устройства чтения смарт-карт на удаленный компьютер. Проблема в том, что

  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 и нажмите Enter. Вы даже можете подключиться к RDP, немедленно отключиться и нажать Enter на машине A.

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

Последующие действия

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

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


person lxs    schedule 25.06.2012    source источник
comment
Возможно, опубликуйте этот обходной путь в качестве ответа, чтобы вы могли его принять. Вы всегда можете изменить принятие, если появится лучший ответ (вы можете надеяться, не так ли?)   -  person Maarten Bodewes    schedule 28.06.2012


Ответы (1)


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

person lxs    schedule 09.07.2012