Отправить логин в провайдере учетных данных

Я прочитал эту статью, чтобы разработать свой собственный поставщик учетных данных.

Теперь я хочу протестировать код, прилагаемый к статье в 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 пользовательские учетные данные провайдера

Вы ищете это: LogonUser - MSDN?

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

Вы на самом деле не "отправляете" учетные данные самостоятельно. Вы просто сериализуете их, как показано в принятом ответе выше, заполняя _CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION, и Windows позаботится о фактической отправке их в Winlogon.exe

Затем вы можете проверить результат отправки в методе ReportResult().

Другие вопросы по тегам