Отправить логин в провайдере учетных данных
Я прочитал эту статью, чтобы разработать свой собственный поставщик учетных данных.
Теперь я хочу протестировать код, прилагаемый к статье в GitHub.
- я бегу
файл install.reg.
запустить код и показать GUI на экране входа в систему по сценарию изменения
private static bool IsSupportedScenario(_CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus) { switch (cpus) { case _CREDENTIAL_PROVIDER_USAGE_SCENARIO.CPUS_CREDUI: return true; case _CREDENTIAL_PROVIDER_USAGE_SCENARIO.CPUS_UNLOCK_WORKSTATION: return true; case _CREDENTIAL_PROVIDER_USAGE_SCENARIO.CPUS_LOGON: return true; case _CREDENTIAL_PROVIDER_USAGE_SCENARIO.CPUS_CHANGE_PASSWORD: case _CREDENTIAL_PROVIDER_USAGE_SCENARIO.CPUS_PLAP: case _CREDENTIAL_PROVIDER_USAGE_SCENARIO.CPUS_INVALID: default: return false; } }
вопрос в том, как я могу ввести введенное имя пользователя / пароль и успешно войти в систему, если правильно
2 ответа
Я использую этот пример Windows-Credentials-поставщика, изменить сценарии использования, как указано выше в вопросе, но имя пользователя / пароль в этой функции
public int GetSerialization(out _CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE pcpgsr,
out _CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION pcpcs, out string ppszOptionalStatusText,
out _CREDENTIAL_PROVIDER_STATUS_ICON pcpsiOptionalStatusIcon)
{
Log.LogMethodCall();
try
{
pcpgsr = _CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE.CPGSR_RETURN_CREDENTIAL_FINISHED;
pcpcs = new _CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION();
var username = "Domain\\username";
var password = "password";
var inCredSize = 0;
var inCredBuffer = Marshal.AllocCoTaskMem(0);
if (!PInvoke.CredPackAuthenticationBuffer(0, username, password, inCredBuffer, ref inCredSize))
{
Marshal.FreeCoTaskMem(inCredBuffer);
inCredBuffer = Marshal.AllocCoTaskMem(inCredSize);
if (PInvoke.CredPackAuthenticationBuffer(0, username, password, inCredBuffer, ref inCredSize))
{
ppszOptionalStatusText = string.Empty;
pcpsiOptionalStatusIcon = _CREDENTIAL_PROVIDER_STATUS_ICON.CPSI_SUCCESS;
pcpcs.clsidCredentialProvider = Guid.Parse(Constants.CredentialProviderUID);
pcpcs.rgbSerialization = inCredBuffer;
pcpcs.cbSerialization = (uint)inCredSize;
RetrieveNegotiateAuthPackage(out var authPackage);
pcpcs.ulAuthenticationPackage = authPackage;
return HResultValues.S_OK;
}
ppszOptionalStatusText = "Failed to pack credentials";
pcpsiOptionalStatusIcon = _CREDENTIAL_PROVIDER_STATUS_ICON.CPSI_ERROR;
return HResultValues.E_FAIL;
}
}
catch (Exception)
{
// In case of any error, do not bring down winlogon
}
finally
{
shouldAutoLogin = false; // Block auto-login from going full-retard
}
pcpgsr = _CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE.CPGSR_NO_CREDENTIAL_NOT_FINISHED;
pcpcs = new _CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION();
ppszOptionalStatusText = string.Empty;
pcpsiOptionalStatusIcon = _CREDENTIAL_PROVIDER_STATUS_ICON.CPSI_NONE;
return HResultValues.E_NOTIMPL;
}
наконец, я могу проверить.net пользовательские учетные данные провайдера
Это тоже меня вешало. Но это было только мое недопонимание того, как работают поставщики учетных данных и как реализовать их интерфейсы.
Вы на самом деле не "отправляете" учетные данные самостоятельно. Вы просто сериализуете их, как показано в принятом ответе выше, заполняя _CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION, и Windows позаботится о фактической отправке их в Winlogon.exe
Затем вы можете проверить результат отправки в методе ReportResult().