为所有用户激活的凭据提供程序 V2(磁贴)

Posted

技术标签:

【中文标题】为所有用户激活的凭据提供程序 V2(磁贴)【英文标题】:Credential Providers V2 Active for All users(Tiles) 【发布时间】:2020-05-13 23:39:40 【问题描述】:

我使用“Windows 10 中的凭据提供程序”的示例代码。我开发了我的代码并把它改得很好。

但我有一些问题:

我的窗口中的所有用户都没有启用(显示磁贴)。 (仅对一位用户显示)

我看到这个问题:

https://***.com/a/31247811/3477587

Credential provider not displayed for all users (Other user included)

所以我更改了我的代码,但是当从我的 DLL 中使用时,win-login 不会加载,我必须在安全模式下删除才能在没有凭据提供程序的情况下进入我的窗口。

我将代码更改如下:

std::vector<CSamanCredential*>          _pCredential;    // SampleV2Credential

HRESULT CSamanProvider::GetCredentialAt(
    DWORD dwIndex,
    _Outptr_result_nullonfailure_ ICredentialProviderCredential** ppcpc)

    HRESULT hr = E_INVALIDARG;
    *ppcpc = nullptr;

    hr = _pCredential[dwIndex]->QueryInterface(IID_PPV_ARGS(ppcpc));

    return hr;



HRESULT CSamanProvider::GetCredentialCount(
    _Out_ DWORD* pdwCount,
    _Out_ DWORD* pdwDefault,
    _Out_ BOOL* pbAutoLogonWithDefault)

    *pdwDefault = CREDENTIAL_PROVIDER_NO_DEFAULT;
    *pbAutoLogonWithDefault = FALSE;

    if (_fRecreateEnumeratedCredentials)
    
        _fRecreateEnumeratedCredentials = false;
        _ReleaseEnumeratedCredentials();
        _CreateEnumeratedCredentials();
    

    DWORD dwUserCount = 0;
    HRESULT hr;

    if (_pCredProviderUserArray != nullptr) 
        hr = _pCredProviderUserArray->GetCount(&dwUserCount);
    

    if ((dwUserCount == 0) || (IsOS(OS_DOMAINMEMBER) == 1)) 
        dwUserCount += 1;//display additional empty tile
    
    *pdwCount = dwUserCount;

    return S_OK;



void CSamanProvider::_ReleaseEnumeratedCredentials()

    DWORD dwUserCount;
    _pCredProviderUserArray->GetCount(&dwUserCount);
    for (DWORD i = 0; i < dwUserCount; i++) 
        if (_pCredential[i] != nullptr)
        
            _pCredential[i]->Release();
            _pCredential[i] = nullptr;
        
    

所以我更改了代码中的其他位置,但没有得到结果。

【问题讨论】:

【参考方案1】:

您必须按照您提到的帖子中的说明进行操作。

作为对ICredentialProviderSetUserArray::SetUserArray 的间接响应,您必须为提供的列表中的每个用户准备磁贴。

稍后您的图块将被要求提供ICredentialProviderCredential2::GetUserSid。 在那里,您的磁贴必须返回上一步列表中的 SID 之一。

当我实现这个逻辑时,我不得不重新设计我的大部分代码来支持这个功能。

【讨论】:

【参考方案2】:

我阅读了这段代码。这对于了解指令和其他细节非常有帮助。

https://github.com/multiOTP/multiOTPCredentialProvider

此代码 (C++) 为计算机上的所有用户激活 CP。

谢谢

【讨论】:

以上是关于为所有用户激活的凭据提供程序 V2(磁贴)的主要内容,如果未能解决你的问题,请参考以下文章

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

win8中的凭据提供程序

Windows 8.1 x64 - V2 凭据提供程序

如何使用 V2 CP 示例自定义 Windows 10 凭据提供程序?

使用 C# 的 Windows 10 凭据提供程序

使用 Windows 7 SDK 的凭据提供程序示例