5

資格情報プロバイダーとフィルターを開発しています。ロックシナリオに問題があります。

まず、ここから 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"

実際には、ロック シナリオ以外はすべてうまく機能します。ログオンに成功したら、ロックをクリックします。通常、ユーザーを切り替えるかログオフすると、資格情報がログオン画面に表示されます。しかし、フィルターを実装しただけでは何も表示されず、資格情報のない青いログオン画面だけが表示されます。

何が起こって何をすべきか知っている人はいますか?

4

1 に答える 1

5

この質問は古いことは知っていますが、数か月前に編集されたばかりなので、まだ関連している可能性があります.

ロック解除のシナリオでは、独自の資格情報プロバイダーを実行から除外していると思います。「CLSID_CSampleProvider」を「CLSID_PasswordCredentialProvider」に変更してみて、その効果を確認してください。ラップ資格情報プロバイダーを実行しており、この ID でフィルターを使用しており、完全に機能しています。私の資格情報は、ログオンおよびロック解除のシナリオの下に表示されます。

于 2012-12-12T12:29:22.883 に答える