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

求助:开发集成指纹认证的Windows自定义凭据提供商

自定义Windows指纹认证凭据提供商开发求助

我正在开发一款集成指纹认证的Windows自定义凭据提供商,具体需求:

  • 使用外部指纹阅读器/软件完成用户指纹身份验证
  • 必须对接Windows生物指纹API(WBF)实现与操作系统的集成

我没有Windows平台及相关API的开发经验,一直未找到适配的开源示例项目,希望有Windows凭据提供商开发经验的人士提供以下三方面的指引:

  • Windows生物指纹API的使用方法
  • 外部指纹阅读器/软件的集成方案
  • 自定义凭据提供商的整体架构设计

若能提供完整可用的开源示例或模板,将更为理想。

我曾找到过类似问题,但答案不够清晰,缺乏指导性,对新手不友好。此外,我向ChatGPT咨询得到了一段代码,但该代码仅为框架,未实现核心功能,不够完善,代码如下:

#include <credentialprovider.h>
#include <windows.h>

class MyCredentialProvider : public ICredentialProvider, public ICredentialProviderCredential
{
public:
    // Implement ICredentialProvider methods
    HRESULT STDMETHODCALLTYPE SetUsageScenario(
        __in CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus,
        __in DWORD dwFlags
        ) override;

    HRESULT STDMETHODCALLTYPE SetSerialization(
        __in const CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION* pcpcs
        ) override;

    HRESULT STDMETHODCALLTYPE Advise(
        __in ICredentialProviderEvents* pcpe,
        __in UINT_PTR upAdviseContext
        ) override;

    HRESULT STDMETHODCALLTYPE UnAdvise() override;

    HRESULT STDMETHODCALLTYPE GetFieldDescriptorCount(
        __out DWORD* pdwCount
        ) override;

    HRESULT STDMETHODCALLTYPE GetFieldDescriptorAt(
        __in DWORD dwIndex,
        __deref_out CREDENTIAL_PROVIDER_FIELD_DESCRIPTOR** ppcpfd
        ) override;

    HRESULT STDMETHODCALLTYPE GetCredentialCount(
        __out DWORD* pdwCount,
        __out DWORD* pdwDefault,
        __out BOOL* pbAutoLogonWithDefault
        ) override;

    HRESULT STDMETHODCALLTYPE GetCredentialAt(
        __in DWORD dwIndex,
        __out ICredentialProviderCredential** ppcpc
        ) override;

    // Implement ICredentialProviderCredential methods
    HRESULT STDMETHODCALLTYPE Advise(
        __in ICredentialProviderCredentialEvents* pcpce
        ) override;

    HRESULT STDMETHODCALLTYPE UnAdvise() override;

    HRESULT STDMETHODCALLTYPE SetSelected(
        __out BOOL* pbAutoLogon
        ) override;

    HRESULT STDMETHODCALLTYPE SetDeselected() override;

    HRESULT STDMETHODCALLTYPE GetFieldState(
        __in DWORD dwIndex,
        __out CREDENTIAL_PROVIDER_FIELD_STATE* pcpfs,
        __out CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE* pcpfis
        ) override;

    HRESULT STDMETHODCALLTYPE GetStringValue(
        __in DWORD dwIndex,
        __out LPWSTR* ppwsz
        ) override;

    HRESULT STDMETHODCALLTYPE GetBitmapValue(
        __in DWORD dwIndex,
        __out HBITMAP* phbmp
        ) override;

    HRESULT STDMETHODCALLTYPE GetCheckboxValue(
        __in DWORD dwIndex,
        __out BOOL* pbChecked,
        __deref_out LPWSTR* ppwszLabel
        ) override;

    HRESULT STDMETHODCALLTYPE GetSubmitButtonValue(
        __in DWORD dwIndex,
        __out DWORD* pdwAdjacentTo
        ) override;

    HRESULT STDMETHODCALLTYPE GetComboBoxValueCount(
        __in DWORD dwIndex,
        __out DWORD* pcItems,
        __out DWORD* pdwSelectedItem
        ) override;

    HRESULT STDMETHODCALLTYPE GetComboBoxValueAt(
        __in DWORD dwIndex,
        __in DWORD dwItem,
        __deref_out LPWSTR* ppwszItem
        ) override;

    HRESULT STDMETHODCALLTYPE SetStringValue(
        __in DWORD dwIndex,
        __in PCWSTR pwz
        ) override;

private:
    // Add private members and methods as needed
};

// Implement ICredentialProvider methods
HRESULT STDMETHODCALLTYPE MyCredentialProvider::SetUsageScenario(
    __in CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus,
    __in DWORD dwFlags
    )
{
    // TODO: Implement SetUsageScenario method
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE MyCredentialProvider::SetSerialization(
    __in const CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION* pcpcs
    )
{
    // TODO: Implement SetSerialization method
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE MyCredentialProvider::Advise(
    __in ICredentialProviderEvents* pcpe,
    __in UINT_PTR upAdviseContext
    )
{
    // TODO: Implement Advise method
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE MyCredentialProvider::UnAdvise()
{
    // TODO: Implement UnAdvise method
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE MyCredentialProvider::GetFieldDescriptorCount(
    __out DWORD* pdwCount
    )
{
    // TODO: Implement GetFieldDescriptorCount method
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE MyCredentialProvider::GetFieldDescriptorAt(
    __in DWORD dwIndex,
    __deref_out CREDENTIAL_PROVIDER_FIELD_DESCRIPTOR** ppcpfd
    )
{
    // TODO: Implement GetFieldDescriptorAt method
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE MyCredentialProvider::GetCredentialCount(
    __out DWORD* pdwCount,
    __out DWORD* pdwDefault,
    __out BOOL* pbAutoLogonWithDefault
    )
{
    // TODO: Implement GetCredentialCount method
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE MyCredentialProvider::GetCredentialAt(
    __in DWORD dwIndex,
    __out ICredentialProviderCredential** ppcpc
    )
{
    // TODO: Implement GetCredentialAt method
    return E_NOTIMPL;
}

// Implement ICredentialProviderCredential methods
HRESULT STDMETHODCALLTYPE MyCredentialProvider::Advise(
    __in ICredentialProviderCredentialEvents* pcpce
    )
{
    // TODO: Implement Advise method
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE MyCredentialProvider::UnAdvise()
{
    // TODO: Implement UnAdvise method
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE MyCredentialProvider::SetSelected(
    __out BOOL* pbAutoLogon
    )
{
    // TODO: Implement SetSelected method
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE MyCredentialProvider::SetDeselected()
{
    // TODO: Implement SetDeselected method
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE MyCredentialProvider::GetFieldState(
    __in DWORD dwIndex,
    __out CREDENTIAL_PROVIDER_FIELD_STATE* pcpfs,
    __out CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE* pcpfis
    )
{
    // TODO: Implement GetFieldState method
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE MyCredentialProvider::GetStringValue(
    __in DWORD dwIndex,
    __out LPWSTR* ppwsz
    )
{
    // TODO: Implement GetStringValue method
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE MyCredentialProvider::GetBitmapValue(
    __in DWORD dwIndex,
    __out HBITMAP* phbmp
    )
{
    // TODO: Implement GetBitmapValue method
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE MyCredentialProvider::GetCheckboxValue(
    __in DWORD dwIndex,
    __out BOOL* pbChecked,
    __deref_out LPWSTR* ppwszLabel
    )
{
    // TODO: Implement GetCheckboxValue method
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE MyCredentialProvider::GetSubmitButtonValue(
    __in DWORD dwIndex,
    __out DWORD* pdwAdjacentTo
    )
{
    // TODO: Implement GetSubmitButtonValue method
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE MyCredentialProvider::GetComboBoxValueCount(
    __in DWORD dwIndex,
    __out DWORD* pcItems,
    __out DWORD* pdwSelectedItem
    )
{
    // TODO: Implement GetComboBoxValueCount method
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE MyCredentialProvider::GetComboBoxValueAt(
    __in DWORD dwIndex,
    __in DWORD dwItem,
    __deref_out LPWSTR* ppwszItem
    )
{
    // TODO: Implement GetComboBoxValueAt method
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE MyCredentialProvider::SetStringValue(
    __in DWORD dwIndex,
    __in PCWSTR pwz
    )
{
    // TODO: Implement SetStringValue method
    return E_NOTIMPL;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 17:04:51