0

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

但我有一些问题:

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

在此处输入图像描述

我看到这个问题:

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

未为所有用户显示凭据提供程序(包括其他用户)

所以我更改了我的代码,但是当从我的 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;
        }
    }
}

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

4

2 回答 2

1

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

https://github.com/multiOTP/multiOTPCredentialProvider

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

谢谢

于 2020-05-17T05:59:19.667 回答
1

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

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

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

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

于 2020-05-15T06:51:40.570 回答