2016-03-07 3 views
1

Мне нужна помощь в отправке информации о сертификатах из одной программы в другую и входе в 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. Я предполагаю, что имя пользователя должно быть восстановлено с момента его вызова другим пользователем/программой, но это предположение может быть неправильным.

+0

(Я не специалист по внутренним системам 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

+0

[This] (https://technet.microsoft.com/en-us/library/ff404289 (WS.10) .aspx), также интересно. – vlp

+0

@vlp Спасибо за комментарии. Я установил ссылку на пример. Я изучал CryptAcquireContext, и я определенно должен понять его лучше. Я продолжаю вникать в документацию, чтобы попытаться найти рабочее решение. – Snowman6286

ответ

0

Я получил свою примерную программу, которая работает с CertSerializeCertificatesStoreElement и CertAddCertificateContextToStore. Я могу сериализовать сертификат и добавить его в новый магазин в памяти позднее. Я пробовал это раньше, но случайно не сохранил размер сериализованного элемента, я просто попытался использовать sizeof() элемент, который вернул неправильный размер.

Если кто-то хочет отправить учетные данные сертификатов между программами в одном и том же пространстве пользователей, этот подход будет работать хорошо.

Я сделал этот шаг вперед и реализовал его в моей парадигме userpace/SYSTEM. Логика работала корректно, и я смог сгенерировать имя пользователя, но все равно не смог LogonUser. После следующей недели или проб и ошибок я нашел решение, которое работает между пользовательским пространством и системой. В итоге мне пришлось использовать LsaLogonUser вместо LogonUser.

Если кто-то хочет, чтобы программа пользовательского пространства отправляла учетные данные демону, запущенному в SYSTEM, и чтобы эта программа спустилась до пользователя, используйте этот example. Сначала я попробовал это very similar example, но он продолжает терпеть неудачу. В рабочем примере вам не нужно передавать домен или имя пользователя только PIN-код. Система будет считывать смарт-карту у считывателя и проверять ее с помощью PIN-кода. Это решение будет работать на компьютерах, ТОЛЬКО, если смарт-карта находится на удаленном компьютере. Я изучаю способ выполнения работы с смарт-картой на главном компьютере, но он находится за пределами этой публикации.

Надеюсь, это сэкономит кому-то недели работы, которые я поставил перед собой.