Windows 凭据提供程序、筛选器和解锁工作站方案
Posted
技术标签:
【中文标题】Windows 凭据提供程序、筛选器和解锁工作站方案【英文标题】:Windows Credential Provider, Filter, and Unlock Workstation Scenario 【发布时间】:2011-07-04 07:50:29 【问题描述】:我正在开发凭据提供程序和过滤器。我在锁定方案方面遇到了一些问题。
首先,我尝试了来自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"
实际上,除了锁定场景之外,一切都运行良好。所以,在我成功登录后,我点击锁定。通常,如果我切换用户或注销,我的凭据应该会出现在登录屏幕上。但是现在,只执行过滤器后,什么都没有,只有蓝色的登录屏幕,没有任何凭据。
有谁知道会发生什么以及该怎么做?
【问题讨论】:
【参考方案1】:我知道这个问题已经过时了,但由于它仅在几个月前进行了编辑,它可能仍然具有相关性。
我相信在您的解锁方案下,您将自己的凭据提供程序排除在运行之外;尝试更改: 'CLSID_CSampleProvider' 到 'CLSID_PasswordCredentialProvider' 看看有什么效果。我有一个 Wrap Credential Provider 正在运行,我正在使用具有此 ID 的过滤器并且它运行良好。我的凭据显示在登录和解锁场景下。
【讨论】:
以上是关于Windows 凭据提供程序、筛选器和解锁工作站方案的主要内容,如果未能解决你的问题,请参考以下文章
凭据提供程序使用方案:从Windows 10中删除了CPUS_UNLOCK_WORKSTATION
如何从服务中可靠地捕获 Windows 登录、注销、锁定和解锁事件?