資格情報プロバイダーとフィルターを開発しています。ロックシナリオに問題があります。
まず、ここから 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"
実際には、ロック シナリオ以外はすべてうまく機能します。ログオンに成功したら、ロックをクリックします。通常、ユーザーを切り替えるかログオフすると、資格情報がログオン画面に表示されます。しかし、フィルターを実装しただけでは何も表示されず、資格情報のない青いログオン画面だけが表示されます。
何が起こって何をすべきか知っている人はいますか?