Поставщик учетных данных Windows, сценарий фильтрации и разблокировки рабочей станции - PullRequest
3 голосов
/ 04 июля 2011

Я разрабатываю провайдер учетных данных и фильтр. У меня есть некоторые проблемы со сценарием блокировки.

Сначала я попробовал SampleAllControlCredentialProvider из здесь . И это работает. Даже когда я вхожу в систему и блокирую ее позже, она показывает мои учетные данные.

Во-вторых, я попытался создать свой собственный фильтр провайдера учетных данных, добавив несколько строк кода. Фильтр отфильтровывает учетные данные Windows, разрешено отображать только мои учетные данные. Вот мое дополнение кодов:

В CSampleProvider.h я делаю класс для реализации ICredentialProviderFilter

class CSampleProvider : public ICredentialProvider, public ICredentialProviderFilter

В CSampleProvider.h я меняю STDMETHOD (QueryInterface) на

STDMETHOD (QueryInterface)(REFIID riid, void** ppv)
{
    HRESULT hr;
    if (IID_IUnknown == riid)
        {
        *ppv = this;
        AddRef();
        hr = S_OK;
        }
        else if (IID_ICredentialProvider == riid)
        {
        *ppv = static_cast<ICredentialProvider*>(this);
        AddRef();
        hr = S_OK;
        }
        else if (IID_ICredentialProviderFilter == riid)
    {
        *ppv = static_cast<ICredentialProviderFilter*>(this);
        AddRef();
        hr = S_OK;
    }
    else
    {
        *ppv = NULL;
        hr = E_NOINTERFACE;
    }
    return hr;
}

Еще в CSampleProvider.h я добавляю эти строки кодов

//ICredentialProviderFilter
  public:
        /**
        * \brief method to filter CPProvider
        * \param cpus - CP usage scenario
        * \param dwFlags
        * \param rgclsidProviders
        * \param rgbAllow
        * \param cProviders
        * \return IFACEMETHODIMP
        */
        IFACEMETHODIMP Filter( 
            CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus,
            DWORD dwFlags,
            GUID *rgclsidProviders,
            BOOL *rgbAllow,
            DWORD cProviders);

        /**
        * \brief method to update remote logon credential
        * \param pcpcsIn - serialized logon credential
        * \param pcpcsOut - returned logon credential
        * \return IFACEMETHODIMP
        */
        IFACEMETHODIMP UpdateRemoteCredential( 
            const CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION *pcpcsIn,
            CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION *pcpcsOut);

Тогда это реализация методов фильтра (внутри CSampleProvider.cpp):

HRESULT CSampleProvider::Filter(CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus,DWORD dwFlags,GUID* rgclsidProviders,BOOL* rgbAllow,DWORD cProviders)
{
    //UNUSED(dwFlags);
    UNREFERENCED_PARAMETER(dwFlags);
    MessageBox(NULL, "Filter!", "Trace", NULL);
    switch (cpus)
    {
        case CPUS_LOGON:
        case CPUS_UNLOCK_WORKSTATION:
            //Filters out the default Windows provider (only for Logon and Unlock scenarios)
            for (int i = 0; i < (int)cProviders; i++)
            {
                if (IsEqualGUID(rgclsidProviders[i], CLSID_CSampleProvider)) rgbAllow[i]=true;
                else rgbAllow[i] = false;;
                //rgbAllow[i]=true;
            }
        return S_OK;
        case CPUS_CREDUI:
        case CPUS_CHANGE_PASSWORD:
        return E_NOTIMPL;
        default:
        return E_INVALIDARG;
    }
}

HRESULT CSampleProvider::UpdateRemoteCredential(const CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION* pcpcsIn, CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION* pcpcsOut)
{
    UNREFERENCED_PARAMETER(pcpcsOut);
    UNREFERENCED_PARAMETER(pcpcsIn);
    return E_NOTIMPL;
}

Наконец, я запускаю этот файл .reg, содержащий:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\Credential Providers\{F2ADF4EC-5DAA-407e-9776-10B25A64A435}]
@="SampleAllControlsCredentialProvider"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\Credential Provider Filters\{F2ADF4EC-5DAA-407e-9776-10B25A64A435}]
@="SampleAllControlsCredentialProvider"

[HKEY_CLASSES_ROOT\CLSID\{F2ADF4EC-5DAA-407e-9776-10B25A64A435}]
@="SampleAllControlsCredentialProvider"

[HKEY_CLASSES_ROOT\CLSID\{F2ADF4EC-5DAA-407e-9776-10B25A64A435}\InprocServer32]
@="SampleAllControlsCredentialProvider.dll"
"ThreadingModel"="Apartment"

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

Кто-нибудь знает, что происходит и что делать?

1 Ответ

4 голосов
/ 12 декабря 2012

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

Я полагаю, что при вашем сценарии разблокировки вы исключаете возможность запуска своего собственного поставщика учетных данных;попробуйте изменить: «CLSID_CSampleProvider» на «CLSID_PasswordCredentialProvider» и посмотрите, какой эффект это имеет.У меня работает провайдер учетных данных Wrap, и я использую фильтр с этим идентификатором, и он отлично работает.Мои учетные данные отображаются в сценариях входа и разблокировки.

...