You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为V2 Credential Provider Sample添加多本地用户凭据提供者的问题

问题描述

我是Credential Provider领域的新手,从微软V2 Credential Provider示例入手学习。该示例仅为本地管理员账户添加自定义Credential Provider,我希望让所有本地账户都能使用它。

我参考了多个技术社区问题和开源仓库后,对代码做了如下修改,但仍未解决问题:

代码修改内容

在CSampleProvider.h中:

// 原代码
// CSampleCredential                       *_pCredential;
// 修改后
std::vector<CSampleCredential*>         _pCredential;

在CSampleProvider.cpp中:

CSampleProvider::~CSampleProvider()
{
    // 原代码
    // if (_pCredential != nullptr)
    // {
    //    _pCredential->Release();
    //    _pCredential = nullptr;
    // }
    _ReleaseEnumerateCredentials();
   ...
}


HRESULT CSampleProvider::GetCredentialCount(...)
{
    ...
    // 原代码
    // *pdwCount = 1;
    DWORD dwUserCount;
    _pCredProviderUserArray->GetCount(&dwUserCount);
    *pdwCount = dwUserCount;
    ...
}

HRESULT CSampleProvider::GetCredentialAt(...) {
    ...
    // 原代码
    // if ((dwIndex == 0) && ppcpc)
    // {
    //    hr = _pCredential->QueryInterface(IID_PPV_ARGS(ppcpc));
    // }
    if ((dwIndex == 0) && ppcpc)
    {
        hr = _pCredential[dwIndex]->QueryInterface(IID_PPV_ARGS(ppcpc));
    }
    ...
}

void CSampleProvider::_ReleaseEnumeratedCredentials()
{
    DWORD dwUserCount;
    _pCredProviderUserArray->GetCount(&dwUserCount);
    if (!_pCredential.empty())
    {
        for (DWORD i = 0; i < dwUserCount; i++)
        {
            _pCredential[0]->Release();
            _pCredential.erase(_pCredential.begin());
        }
    }
}

HRESULT CSampleProvider::_EnumerateCredentials()
{
    HRESULT hr = E_UNEXPECTED;
    if (_pCredProviderUserArray != nullptr)
    {
        DWORD dwUserCount;
        _pCredProviderUserArray->GetCount(&dwUserCount);
        if (dwUserCount > 0)
        {
            for (DWORD i = 0; i < dwUserCount; i++) {
                ICredentialProviderUser *pCredUser;
                hr = _pCredProviderUserArray->GetAt(0, &pCredUser);
                if (SUCCEEDED(hr))
                {
                    _pCredential.push_back(new(std::nothrow) CSampleCredential());
                    if (_pCredential[i] != nullptr)
                    {
                        hr = _pCredential[i]->Initialize(_cpus, s_rgCredProvFieldDescriptors, s_rgFieldStatePairs, pCredUser);
                        if (FAILED(hr))
                        {
                            _pCredential[i]->Release();
                            _pCredential[i] = nullptr;
                        }
                    }
                    else
                    {
                        hr = E_OUTOFMEMORY;
                    }
                    pCredUser->Release();
                }
            }
        }
    }
    return hr;
}

当前疑问

  1. 我了解到需要在getUserSID()中返回不同的SID,但不知道如何正确实现。
  2. 修改后虚拟机环境出现崩溃,仍无法实现多本地用户适配。
  3. 想了解调试Credential Provider程序的方法。

内容的提问来源于stack exchange,提问作者stevenchucp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 03:05:28