2

我正在開發憑證提供程序和篩選器。我有一些鎖定方案的問題。Windows憑據提供程序,篩選器和解鎖工作站方案

首先,我嘗試了here的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" 

其實,一切正常,除了只是爲了鎖定場景。所以,我成功登錄後,點擊鎖定。通常,如果我切換用戶或註銷,我的憑證應該出現在登錄屏幕上。但是現在,在僅實現過濾器之後,沒有任何顯示,只有沒有任何憑據的藍色登錄屏幕。

有誰知道會發生什麼,做什麼?

回答

3

我知道這個問題很陳舊,但由於它僅在幾個月前被編輯過,它可能仍然是相關的。

我相信在您解鎖的情況下,您將排除自己的憑證提供者的運行;嘗試更改:'CLSID_CSampleProvider'到'CLSID_PasswordCredentialProvider',看看它有什麼影響。我有一個Wrap憑證提供程序正在運行,我正在使用具有此ID的過濾器,並且其工作正常。我的憑據顯示在登錄和解鎖情況下。

相關問題