Bre*_*gby 0 winlogon visual-c++ windows-7 credential-providers
我使用了Microsoft的Credential Provider示例来组合默认Windows 7登录屏幕的包装器.
就新的CP而言,所有内容似乎都运行良好,但我的登录屏幕上出现了重复的图块,即默认的Windows图块和我的"包装"图块.
如何删除默认的Windows磁贴,因为这不包含我的更改?
有两种可能的解决方案:
1.仔细查看 GetCredentialCount提供商的功能.
在包装现有提供程序的情况下,在该函数中,您应该从底层提供程序(被包装的那个)获取凭据的计数,并用您的凭据包装它们.也许,不知何故(由于代码中的逻辑错误),您可以制作几个重复的凭据.(我从来没有写过包装器,但这种方法可能有意义).
2. 另一种方式是写自己 CredentialProviderFilter 通过实现 ICredentialProviderFilter 界面.
!如果你看看HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication注册表项,你会看到其他子项中有2个有趣的:Credential Providers和Credential Provider Filters.
这就是它在我的电脑上的样子:

在Credential Providers下面列出了Windows的所有凭据提供程序,其中有自己的凭据提供程序.这个想法Credential Provider Filter是过滤掉除你的一个以外的所有其他凭据提供者.您可以通过以下方式区分凭据提供程序GUID.
这个的实现非常简单 - 你必须从ICredentialProviderFilter接口实现一个方法.这个方法是ICredentialProviderFilter::Filter.
HRESULT MyProviderFilter::Filter(
CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus,
DWORD dwFlags,
GUID *rgclsidProviders,
BOOL *rgbAllow,
DWORD cProviders)
{
UNREFERENCED_PARAMETER(dwFlags);
for (DWORD dwI = 0; dwI < cProviders; dwI++)
{
if (!IsEqualGUID(rgclsidProviders[dwI], myProviderGUID))
{
rgbAllow[dwI] = FALSE;
} else rgbAllow[dwI] = TRUE;
}
return S_OK;
}
Run Code Online (Sandbox Code Playgroud)
因此,除了您的提供者之外,所有提供者都将被禁止.您可以实现ICredentialProviderFilter和ICredentialProvider在一个模块.据我所知,有一个凭证提供者过滤器的示例Microsoft Windows SDK.
祝好运!