Когда-то давно (во времена Windows 2000 и Windows XP) пользователь мог без проблем работать с локальными смарт-картами (ЭЦП, токенами) рабочей станции или терминального сервера, подключившись по RDP. В Windows Vista механизм изменился, теперь в терминальный сеанс «пробрасывалась» смарт-карта клиента, а работать с подключенными к серверу смарт-картами стало нельзя. Так дела обстоят и поныне, кто-то использует альтернативные механизмы удаленных сеансов (VNC или даже какой-нибудь AnyDesk), в организациях часто встречаются аппаратные решения USB-over-IP, продвинутые пользователи могут использовать аналогичную программную реализацию. Ещё сюда можно приплести КриптоПро CSP, последние билды которого реализуют собственную службу локальных смарт-карт, но это уже что-то из разряда крайне сомнительных решений. Как обычно я предлагаю решение проще, лучше, радикальнее.

Сразу оговорюсь, что в общем и целом я согласен с нынешним подходом — условная ЭЦП должна находиться у пользователя на руках, а не в терминальном сервере. И, тем не менее, возникают ситуации, когда требуется реализовать именно удалённый формат эксплуатации. Безопасность в ваших руках, действуйте осмотрительно и с умом.

Описываемое решение предназначено для Windows 10 20H1-22H2 (решениями для Windows 11 в настоящий момент я не занимаюсь вообще), причем речь строго о 64-х разрядных версиях.

Сделать терминальный сервер из десктопной Windows 10 вы сами сможете запросто через RDP Wrapper.

Если не ходить вокруг и около, то палки в колёса вставляет WinSCard.dll — одна-единственная библиотека. Эталонный вариант для дальнейшей модификации я извлёк из Win10 22H2 10.0.19045.6691, однако версия самой библиотеки оказалась 10.0.19041.3636 (что соответствует Win10 20H1). Вывод очень простой — когда Win10 обновляется, то обновляются отнюдь не все компоненты, всегда существует некий «люфт». Перед началом работы убедитесь, что в вашей системе используется та же самая версия библиотеки.

Сама модификация очень простая, нужно открыть библиотеку в HEX-редакторе (используйте любой на ваш выбор) и изменить значения по следующим адресам:

0001D953: 8B->31
0001D954: 43->C0
0001D955: 48->90

После чего сохраняем файл куда-нибудь на видное место. Прежний файл (эталонный) переименовываем, а новую свежепатченную версию подставляем вместо него. Разумеется, потребуется перезагрузка чтобы изменения вступили в силу. Теперь при работе через RDP локальные (относительно сервера) смарт-карты не пропадут, а останутся на месте. Исправленный вариант библиотеки можно скачать здесь.