Visual c++ 使用自定义凭据提供程序时,登录屏幕上出现多个互动程序

Visual c++ 使用自定义凭据提供程序时,登录屏幕上出现多个互动程序,visual-c++,windows-7,winlogon,credential-providers,Visual C++,Windows 7,Winlogon,Credential Providers,我使用了微软的凭据提供程序示例,为默认的Windows7登录屏幕组装了一个包装器 就新的CP而言,一切似乎都运行良好,但我的登录屏幕上出现了重复的磁贴,即默认的Windows磁贴和“包装”磁贴 如何删除默认的Windows互动程序,因为它不包含我的更改?有两种可能的解决方案: 1. 仔细查看提供程序的GetCredentialCount函数如果包装现有提供程序,则在该函数中,您应该从底层提供程序(正在包装的那个提供程序)获取凭据计数,并使用您的凭据进行包装。也许,不知何故(由于代码中的逻辑错误

我使用了微软的凭据提供程序示例,为默认的Windows7登录屏幕组装了一个包装器

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


如何删除默认的Windows互动程序,因为它不包含我的更改?

有两种可能的解决方案:

1. 仔细查看提供程序的
GetCredentialCount
函数
如果包装现有提供程序,则在该函数中,您应该从底层提供程序(正在包装的那个提供程序)获取凭据计数,并使用您的凭据进行包装。也许,不知何故(由于代码中的逻辑错误),您复制了多个凭据。(我从未编写过包装器,但这种方法可能有道理)。

2. 另一种方法是通过实现
ICredentialProviderFilter
接口来编写自己的
凭证ProviderFilter

! 如果您查看
HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication
注册表项,您将看到在其他子项中有两个有趣的子项:
凭证提供程序
凭证提供程序过滤器

我的电脑上就是这样:

凭据提供程序下
列出了windows的所有凭据提供程序,其中包括您自己的凭据提供程序。
credentialprovider 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;
}
HRESULT MyProviderFilter::Filter(
凭据\u提供程序\u使用情况\u场景CPU,
德沃德·德弗拉格,
GUID*rgclsidProviders,
布尔巴洛,
德沃德·卡普罗维德斯)
{
未引用的_参数(dwFlags);
对于(DWORD dwI=0;dwI

因此,除您的提供商外,所有提供商都将被禁止。您可以在一个模块中实现
ICredentialProviderFilter
ICredentialProvider
。据我所知,Microsoft Windows SDK中有一个凭据提供程序筛选器示例


祝你好运

是的,我很抱歉-我用@Apokal的答案解决了这个问题,但是在项目开始运作的冷淡中,我忘记了分配信用。