2

자격 증명 공급자 및 필터를 개발 중입니다. 잠금 시나리오에 몇 가지 문제가 있습니다.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 내부) 필터 방식의 구현이다 잠금 시나리오에만 해당됩니다. 따라서 성공적으로 로그온하면 잠금을 클릭합니다. 일반적으로 사용자를 전환하거나 로그 오프하면 로그온 화면에 내 자격 증명이 나타나야합니다. 그러나 이제는 필터 만 구현 한 후에 아무런 자격 증명이없는 파란색 로그온 화면 만 나타나게됩니다.

어떤 일이 일어나고 무엇을해야하는지 알고 있습니까?

답변

3

나는이 질문이 오래되었음을 알고 있지만 불과 몇 달 전에 편집 되었기 때문에 여전히 관련성이 있습니다.

나는 귀하의 잠금 해제 시나리오에서 자신의 자격 증명 제공자가 실행되지 않도록합니다. 'CLSID_CSampleProvider'를 'CLSID_PasswordCredentialProvider'로 변경하고 그 효과를 확인하십시오. Wrap Credential Provider가 실행 중이며이 ID로 필터를 사용하고 완벽하게 작동합니다. 내 자격 증명이 로그온 및 잠금 해제 시나리오 아래에 나타납니다.