Вот сколько я работаю с виндой, столько её и костерю. И что ни каждый день, то новый повод. На этот раз грабли вылезли в службе смарт-карт (SmartCard).
Сперва небольшой исторический экскурс. Начиная с версии Windows Vista и соответствующих ей серверных систем (Server 2008 R1) мелкомягкие полностью переделали архитектуру работающих со смарт-картами компонентов. Это коснулось в том числе и драйверов.
В первый раз с "нововведениями" я столкнулся, когда попытался сделать для пользователей доступ в локальную сеть через OpenVPN в неинтерактивном режиме с аутентификацией по eToken-у. В Windows XP оно прекрасно работало, в Vista и семерке — перестало. Совместно с аладдиновскими разработчиками причина тому была найдена. В той самой пресловутой "новой архитектуре" системные службы (и вообще все что выполняется не из контекста пользователя) больше не могут общаться с драйверами eToken в PKI-режиме, а драйвера режима ядра в принципе не умеют однофакторную (то есть без ввода пароля на токен) аутентификацию. Надо ли разъяснять, что в неинтерактивном режиме пароль вводить как бе и некому? Вот так было работающее отлаженное решение -> не стало решения.
Теперь я столкнулся с "усовершенствованиями" ещё раз, во всей их красе. Поводом стала ситуация, когда некоторые очень кривые криптопродукты (самый красочный пример — BSS) просто отвратительно работают со смарт-картами в RDP-сеансах. Проще говоря, дико тормозят и тупят. И это заметил не я один. Но поскольку дать [censored] рукожопым программистам из BSS я не в состоянии и отказаться от использования их продуктов — тоже, решил искать обходные пути. Например, редиректить токен на терминал-сервер не встроенным в RDP-клиента способом, а сторонним софтом, который на низком уровне заворачивает USB-шину в Ethernet. Ха-ха, не тут-то было!
Внезапно я узнал, что терминал-сервер так устроен, что локально подключенные к серверу смарт-карты в RDP-сеансах не доступны by design. То есть в самой WinSCard.dll, через которую проходят все вызовы API-функций работы со смарт-картами есть однозначное логическое ветвление. Если вызов приходит из нулевого сеанса (RDP с ключем "/admin", локально залогиненный пользователь, VNC или Radmin и т.д.), то в этой сессии доступны локально подключенные к серверу токены. В противном же случае (если номер RDP-сеанса ненулевой), то возможно работать только со смарт-картами RDP-клиента и только из того же самого сеанса. Пруф.
И дошло до того, что некоторые народные умельцы начали самостоятельно отлаживать и патчить пресловутую WinSCard.dll для того, чтобы можно было работать с физически подключенными к серверу токенами из RDP-сеанса (начало, продолжение). Но это ж онанизм и извращение, согласитесь. Особенно в корпоративных средах.
А на аладдиновских форумах регулярно всплывают вопросы "ой, а почему у меня не работает?" (раз, два).
Вот же "доулучшались", черти мелкомягкие. И чего у них зазудило, спрашивается? Хотели как лучше, а получилось как всегда?