자격 증명 공급자 및 필터를 개발 중입니다. 잠금 시나리오에 몇 가지 문제가 있습니다.Windows 자격 증명 공급자, 필터 및 워크 스테이션 잠금 해제 시나리오
먼저 SampleAllControlCredentialProvider를 here에서 시도했습니다. 그리고 그것은 작동합니다. 나중에 로그온하고 잠글 때도 내 자격 증명을 보여줍니다.
둘째, 일부 코드 줄을 추가하여 내 자격 증명 공급자 필터를 만들려고했습니다. 필터가 Windows의 자격 증명을 필터링하고 내 자격 증명 만 표시되도록 허용합니다.
CSampleProvider.h에서, 내가
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;
}
에, 나는 STDMETHOD (QueryInterface가)을 변경할 클래스가 CSampleProvider.h에서 ICredentialProviderFilter
class CSampleProvider : public ICredentialProvider, public ICredentialProviderFilter
을 구현 할 수 있도록 : 다음은 코드 내 추가됩니다
아직도 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);
,369
사실
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"
은, 모든 제외하고 잘 작동 :
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 파일을 실행 : 1,363,210
그런 다음이합니다 (CSampleProvider.cpp 내부) 필터 방식의 구현이다 잠금 시나리오에만 해당됩니다. 따라서 성공적으로 로그온하면 잠금을 클릭합니다. 일반적으로 사용자를 전환하거나 로그 오프하면 로그온 화면에 내 자격 증명이 나타나야합니다. 그러나 이제는 필터 만 구현 한 후에 아무런 자격 증명이없는 파란색 로그온 화면 만 나타나게됩니다.
어떤 일이 일어나고 무엇을해야하는지 알고 있습니까?