У меня есть еще одна хорошая справочная ссылка здесь, но здесь также есть какие изменения мне потребуются если у меня нет смарт-карты, и я получу сертификаты из личного хранилища пользователей
Я попробовал этот метод, но получить LSALOGIN не удалось, как указано в теме
В эталонном коде для пользователя, не являющегося пользователем домена, я предоставил необходимые SCTCBPriviledge. После этого я заполнил данные сертификата для LSALOGON, как показано ниже, из личного хранилища сертификатов. Но метод не работает, как показано ниже в выводе
Код: Выделить всё
BOOL ConstructAuthCertInfo(const KERB_CERTIFICATE_UNLOCK_LOGON& rkiulIn,LPBYTE* ppbAuthInfo, ULONG* pulAuthInfoLen)
{
UNICODE_STRING DomainName;
UNICODE_STRING UserName;
UNICODE_STRING Password;
NTSTATUS Status;
ULONG_PTR Ptr;
ULONG AuthInfoLength;
wstring WProvName;
DWORD ProvSize = 0;
wstring containerName;
DWORD contSize = 0;
HCRYPTPROV hProv;
DWORD dwKeySpec;
// Fetching the certificate context from the certificate store
// and recieving the CSP handle for the user certificate
HCERTSTORE hStoreHandle = NULL;
PCCERT_CONTEXT pCertContext = NULL;
LPCTSTR pszStoreName = _T("MY");
CERT_CREDENTIAL_INFO certInfo;
HCRYPTHASH hHash;
BOOL bStatus;
DWORD dwHashLen = CERT_HASH_LENGTH;
LPWSTR szMarshaledCred = NULL;
HANDLE hToken;
hStoreHandle = CertOpenSystemStore(NULL, pszStoreName);
if (hStoreHandle)
{
// Since my certificate store has only one user certificate, tring to retrieve PCERT_CONTEXT for it
pCertContext = CertFindCertificateInStore(
hStoreHandle,
PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,
0,
CERT_FIND_ANY,
NULL,
NULL);
if (pCertContext)
{
BOOL bFreeHandle;
// acquire private key container to this certificate
if (CryptAcquireCertificatePrivateKey(pCertContext, CRYPT_ACQUIRE_ALLOW_NCRYPT_KEY_FLAG, NULL, &hProv, &dwKeySpec, &bFreeHandle))
{
cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79108691/i-want-to-test-lsalogonuser-to-do-certificate-based-authentication-without-the-u[/url]
Мобильная версия