Я написал пользовательский Windows Credentials Provider для регистрации входа пользователя. Одной из основных целей этого провайдера является сохранение пароля пользователя и использование его в службе C#, запущенной в Windows при входе в систему.Предоставление учетных данных от поставщика сертификатов службе C#
Это приводит меня к проблеме того, где и как хранить учетную информацию. Во время входа (то есть пользователь предоставляет действительную регистрационную информацию и выбирает логин), служба должна иметь возможность получать информацию и использовать ее.
Каким образом можно передать данные учетной записи в службу?
Та часть, войдите пользователю полномочия более или менее в соответствии с предоставленным образцом Microsoft для Credential Provider, где GetSerialization выглядит следующим образом:
hr = ProtectIfNecessaryAndCopyPassword(_rgFieldStrings[SFI_PASSWORD], _cpus, &pwzProtectedPassword);
g_pwzProtectedPassword = pwzProtectedPassword;
if (SUCCEEDED(hr))
{
PWSTR pszDomain;
PWSTR pszUsername;
hr = SplitDomainAndUsername(_pszQualifiedUserName, &pszDomain, &pszUsername);
if (SUCCEEDED(hr))
{
KERB_INTERACTIVE_UNLOCK_LOGON kiul;
hr = KerbInteractiveUnlockLogonInit(pszDomain, pszUsername, pwzProtectedPassword, _cpus, &kiul);
if (SUCCEEDED(hr))
{
// We use KERB_INTERACTIVE_UNLOCK_LOGON in both unlock and logon scenarios. It contains a
// KERB_INTERACTIVE_LOGON to hold the creds plus a LUID that is filled in for us by Winlogon
// as necessary.
hr = KerbInteractiveUnlockLogonPack(kiul, &pcpcs->rgbSerialization, &pcpcs->cbSerialization);
if (SUCCEEDED(hr))
{
ULONG ulAuthPackage;
hr = RetrieveNegotiateAuthPackage(&ulAuthPackage);
if (SUCCEEDED(hr))
{
pcpcs->ulAuthenticationPackage = ulAuthPackage;
pcpcs->clsidCredentialProvider = CLSID_CredentialProvider;
// At this point the credential has created the serialized credential used for logon
// By setting this to CPGSR_RETURN_CREDENTIAL_FINISHED we are letting logonUI know
// that we have all the information we need and it should attempt to submit the
// serialized credential.
*pcpgsr = CPGSR_RETURN_CREDENTIAL_FINISHED;
}
}
}
CoTaskMemFree(pszDomain);
CoTaskMemFree(pszUsername);
}
CoTaskMemFree(pwzProtectedPassword);
}
EDIT:
Я пытался используйте API учетных данных Windows Credential для сохранения пароля, но это, похоже, не влияет. Когда я пытаюсь получить имя пользователя/пароль, после входа в систему, я ничего не получаю.
DWORD cbCreds = (DWORD)(1 + strlen(password));
CREDENTIALW cred = { 0 };
cred.Type = CRED_TYPE_GENERIC;
cred.TargetName = TargetName;
cred.CredentialBlobSize = cbCreds;
cred.CredentialBlob = (LPBYTE)password;
cred.Persist = CRED_PERSIST_LOCAL_MACHINE;
cred.UserName = *username;
return ::CredWriteW(&cred, 0) ? true : false;