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

Bre*_*gby 0 winlogon visual-c++ windows-7 credential-providers

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

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

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

Apo*_*kal 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;
}
Run Code Online (Sandbox Code Playgroud)


因此,除了您的提供者之外,所有提供者都将被禁止.您可以实现ICredentialProviderFilterICredentialProvider在一个模块.据我所知,有一个凭证提供者过滤器的示例Microsoft Windows SDK.

祝好运!