Мне нужна помощь в отправке информации о сертификатах из одной программы в другую и входе в Windows с этой информацией с использованием CredMarshalCredential и LogonUser. Моя программа в настоящее время успешно передает учетные данные и журналы с обычной комбинацией имени пользователя и пароля. Я просто добавляю возможность делать это с учетными данными Smart Card.Сохранение и загрузка сертификата смарт-карты
Я успешно использовал этот example для входа в систему с сертификатом смарт-карты.
Это работает, когда вы запускаете программу как пользователь, но не при попытке запустить программу как SYSTEM. Это связано с тем, что SYSTEM не может получить доступ к «MY» магазину пользователя. Я пытаюсь обойти это, либо передав сертификат, либо весь магазин сертификатов в программу, запущенную как SYSTEM, из приложения, запущенного как пользователь.
Я пробовал многочисленные подходы к получению чего-то, что бы успешно войти в систему после сериализации, но ничего не получило, чтобы успешно работать. Подход, который, кажется, работает лучше всего, состоял в том, чтобы позвонить CertSaveStore и открыть BLOB. Я использовал последний пример внизу этого Microsoft Example Page. Это правильно восстанавливает хранилище сертификатов из BLOB, находит сертификаты и даже генерирует имя пользователя. Но сгенерированное имя пользователя отличается от исходного сгенерированного имени пользователя и не может войти в систему с ошибкой ERROR_LOGON_FAILURE (неверно имя пользователя или пароль).
Мои текущие тестовые приложения сохраняют сертификат и загружают его снова в ту же программу. На данный момент я выбрал элемент SYSTEM из уравнения. Я предполагаю, что в восстановленном магазине сертификатов отсутствует какая-то информация, но я не уверен, что мне не хватает. Любое понимание было бы оценено.
Одна из последних нот, я изначально попытался просто передать сгенерированное имя пользователя и PIN-код в SYSTEM и уйти с него, но сбой произошел с той же ошибкой ERROR_LOGON_FAILURE. Я предполагаю, что имя пользователя должно быть восстановлено с момента его вызова другим пользователем/программой, но это предположение может быть неправильным.
(Я не специалист по внутренним системам Win32): Нельзя использовать 'CryptAcquireContext' с определенным именем контейнера, как указано [здесь] (https://blogs.msdn.microsoft.com/alejacma/2008/03/03/how-to-select-which-smart-card-reader-to-perform-actions-on /) для доступа к объектам смарт-карты? Затем используйте сертификат для входа. Сторона примечания: ваша ссылка «example» указывает на документацию LogonUser. – vlp
[This] (https://technet.microsoft.com/en-us/library/ff404289 (WS.10) .aspx), также интересно. – vlp
@vlp Спасибо за комментарии. Я установил ссылку на пример. Я изучал CryptAcquireContext, и я определенно должен понять его лучше. Я продолжаю вникать в документацию, чтобы попытаться найти рабочее решение. – Snowman6286