0

我已经使用 Microsoft 的 Credential Provider 示例为默认的 Windows 7 登录屏幕组合了一个包装器。

就新 CP 而言,一切似乎都运行良好,但我的登录屏幕上出现了重复的磁贴,即默认的 Windows 磁贴和我的“包装”磁贴。

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

4

1 回答 1

10

有两种可能的解决方案:

1.仔细查看 GetCredentialCount您的提供商的功能
在包装现有提供者的情况下,在该函数中,您应该从底层提供者(被包装的提供者)获取凭证计数,并用您的凭证包装它们。也许,不知何故(由于代码中的逻辑错误)您制作了多个凭据副本。(我从未编写过包装器,但这种方法可能有意义)。

2.另一种方法是通过实现接口来编写自己的。 !如果您查看注册表项,您会发现在其他子项中有 2 个有趣的:和. 这就是它在我的电脑上的样子: 在CredentialProviderFilter ICredentialProviderFilter
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AuthenticationCredential 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;
}


因此,结果是,除了您的提供者之外,所有提供者都将被禁止。您可以在一个模块中实现ICredentialProviderFilter和。ICredentialProvider据我记得有一个用于凭据提供程序过滤器的示例Microsoft Windows SDK

祝你好运!

于 2012-10-19T07:35:53.273 回答