отправить логин в провайдере учетных данных - PullRequest
0 голосов
/ 16 октября 2018

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

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

вопрос в том, как я могу ввести введенное имя пользователя / пароль и успешно войти в систему, если правильно

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Я использую этот пример 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 being stupid
            }

            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 пользовательский поставщик учетных данных.

0 голосов
/ 26 января 2019

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

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

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

0 голосов
/ 17 октября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...