| ||||
| ||||
Пытаюсь добавить сертификат в "Доверенные корневые центры сертификации" (хранилище ROOT) из сервиса. Использую функцию CertAddEncodedCertificateToStore с параметром CERT_STORE_ADD_ALWAYS. GetLastError возвращает RPC_S_SERVER_UNAVAILABLE - "Сервер RPC недоступен". Сервис запускаю под текущим пользователем, "выставляю" у него рабочий стол текущего пользователя. ОС Win2000+SP4. В чем может быть причина? | ||||
Ответы: | ||||
| ||||
Хранилище текущего пользователя или локального компьютера? Если - пользователя, то должно рисоваться окно-предупреждение об этом. Этот сервис точно умеет рисовать окошки на десктопе пользователя? | ||||
| ||||
Текущего пользователя. Я знаю, что должно выдаваться окно с предупреждением. Сервис умеет рисовать на десктопе текущего пользователя - перед началом работы он отображает другое окно. Но дело не в сервисе, т.к. из простого оконного приложения выдается та же самая ошибка. Причем раньше этот код точно работал. | ||||
| ||||
Если код работал и не менялся - вряд ли он неправильный :) Установка сертификата в "Доверенные корневые..." может быть запрещена доменной политикой (если компьютер в домене). Попробуйте поставить в "Промежуточные..." ("CA") - поставится? | ||||
| ||||
Нет, компьютер не в домене. В CA нормально поставился. Вот код установки: if (!(hCertStore = CertOpenSystemStore(NULL, "CA"))) break; if (!CertAddEncodedCertificateToStore(hCertStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, pBuffer, cBuffer, CERT_STORE_ADD_REPLACE_EXISTING|CERT_STORE_ADD_ALWAYS, NULL)) break; Тут вроде бы напутать то негде :) | ||||
| ||||
Самое интересное в том, что на другой ОС - WinXP + SP2 все работает, т.е. сертификаты нормально установились в хранилище ROOT. | ||||
| ||||
Может, NULL не нравится в CertOpenSystemStore ? из MSDN: hprov [in] Handle of a cryptographic service provider (CSP). Set hProv to NULL to use the default CSP. If hProv is not NULL, it must be a CSP handle created using CryptAcquireContext. На той машине вообще установлен подходящий CSP для этого сертификата? | ||||
| ||||
Да, там только этот криптопровайдер и установлен (не считая дефолтовых). Попробовал передать хэндл криптопровайдера (CryptAcquireContext вызвал с параметром CRYPT_VERIFYCONTEXT), все равно не помогло. | ||||
| ||||
А руками этот сертификат можно в Root поставить? | ||||
| ||||
Спасибо всем, нашлась ошибка. Просто в папке, где располагается сервис, находилась библиотека Crypt32.dll. Поэтому и вылазила эта ошибка. Еще раз спасибо. | ||||