Добрый день!
Проблема следующая.
Есть сервер (ОС - Windows Server 2003), к которому подсоединен eToken (usb-ключ).
Есть пользователь с правами администратора (назовем его admin). Все описанные ниже
действия произведены от него в интерактивном режиме с консоли.
Установлены: eToken (RTE_3.66), CryptoPro 3.0 (csp-sp3-kc1-rus).
Стандартно настроены считыватели и носитель: AKS ifdh 0, AKS ifdh 1; eToken PRO32.
При просмотре сертификатов в контейнере с помощью КриптоПро CSP проблем нет - контейнер с сертификатом виден.
Аналогично, при просмотре свойств eToken видны оба считывателя (AKS ifdh 1 - пустой).
Есть Windows Service, работающий на этом сервере от пользователя admin.
Пользователь admin запускает сервис.
Сервис пытается перечислить все имеющиеся контейнеры, т.е. выполняется примерно такой стандартный код
(обработка ошибок опущена):
CryptAcquireContext( &hProv, NULL, NULL, 75, CRYPT_VERIFYCONTEXT | CRYPT_SILENT ); //75 - Crypto-Pro GOST R 34.10-2001
bool result = CryptGetProvParam( hProv, PP_ENUMCONTAINERS, null, &len, CRYPT_FIRST | CRYPT_FQCN );
//Дальше идет, собственно, цикл перебора имен контейнеров с остальной логикой
Так вот, в описанной ситуации result всегда равно FALSE, а последняя ошибка: ERROR_NO_MORE_ITEMS.
Если же этот код выполняется из обычного приложения, все работает OK - получается полное имя контейнера (как и должно быть).
Было испробовано множество вариантов (просто перечислю примеры функций, которые вызывались для достижения работоспособности -
логика их вызовов, понятно, стояла до обращения к CryptoAPI):
LogonUser, ImpersonateLoggedOnUser, LoadUserProfile, RegCloseKey( HKEY_CURRENT_USER ). [#]
При этом личные сертификаты пользователя admin отлично получаются в сервисе - т.е., на самом деле, профиль пользователя admin загружен.
Так же загрузку профиля подтверждает, например, утилита от Microsoft ProcessMonitor. Причем с помощью этой утилиты, не видно каких-либо ошибок.
На Windows XP все описанное отлично работает (без дополнительного геморроя в виде [#]).
В чем может быть загвоздка?
Может быть КриптоПро некорректно работает в таких ситуациях (windows service, например) на Windows Server 2003?
Может ли помочь в этом случае CSP 3.6?