我已经使用 Microsoft 的 Credential Provider 示例为默认的 Windows 7 登录屏幕组合了一个包装器。
就新 CP 而言,一切似乎都运行良好,但我的登录屏幕上出现了重复的磁贴,即默认的 Windows 磁贴和我的“包装”磁贴。
如何删除默认的 Windows 磁贴,因为它不包含我的更改?
我已经使用 Microsoft 的 Credential Provider 示例为默认的 Windows 7 登录屏幕组合了一个包装器。
就新 CP 而言,一切似乎都运行良好,但我的登录屏幕上出现了重复的磁贴,即默认的 Windows 磁贴和我的“包装”磁贴。
如何删除默认的 Windows 磁贴,因为它不包含我的更改?
有两种可能的解决方案:
1.仔细查看 GetCredentialCount
您的提供商的功能。
在包装现有提供者的情况下,在该函数中,您应该从底层提供者(被包装的提供者)获取凭证计数,并用您的凭证包装它们。也许,不知何故(由于代码中的逻辑错误)您制作了多个凭据副本。(我从未编写过包装器,但这种方法可能有意义)。
2.另一种方法是通过实现接口来编写自己的。 !如果您查看注册表项,您会发现在其他子项中有 2 个有趣的:和.
这就是它在我的电脑上的样子:
在CredentialProviderFilter
ICredentialProviderFilter
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication
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;
}
因此,结果是,除了您的提供者之外,所有提供者都将被禁止。您可以在一个模块中实现ICredentialProviderFilter
和。ICredentialProvider
据我记得有一个用于凭据提供程序过滤器的示例Microsoft Windows SDK
。
祝你好运!