使用自定义凭据提供程序时,在登录屏幕上出现多个切片

时间:2012-10-18 12:27:08

标签: visual-c++ windows-7 winlogon credential-providers

我使用了Microsoft的Credential Provider示例来组合默认Windows 7登录屏幕的包装。

就新CP而言,所有内容似乎都运行良好,但我的登录屏幕上出现了重复的图块,即默认的Windows图块和我的“包裹”图块。

如何删除默认的Windows磁贴,因为这不包含我的更改?

1 个答案:

答案 0 :(得分:7)

有两种可能的解决方案:

 1. 仔细查看提供商的 GetCredentialCount 功能
如果包装现有提供商,在该功能中您应该获得一个计数来自底层提供者的证书(被包装的那个)并由您的凭据包装它们。也许,不知何故(由于代码中的逻辑错误),您可以制作几个重复的凭据。 (我从来没有写过包装器,但这种方法可能有意义)。

 2. 另一种方法是通过实施 CredentialProviderFilter 界面来编写自己的 ICredentialProviderFilter
! 如果您查看HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication注册表项,您会看到其他子项中有2个有趣的:Credential ProvidersCredential 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;
}


因此,除了您的提供者之外,所有提供者都将被禁止。您可以在一个模块中实施ICredentialProviderFilterICredentialProvider。据我记得,Microsoft Windows SDK中有一个凭证提供者过滤器样本。

祝你好运!