如何在 Windows 10 中自定义凭据提供程序中的 LOCK 场景 CPUS_UNLOCK_WORKSTATION 条件中更改用户的域密码

问题描述

我正在为 Windows 10 系统编写 C++ 自定义凭据提供程序。 我在cpuS_logoN场景中成功更改域用户密码,当密码在

过期时

ntsstatus == STATUS_PASSWORD_MUST_CHANGE

情况发生在

凭据:: ReportResult()

但是在LOCK场景,即cpuS_UNLOCK_WORKSTATION中,我无法加载

的“PasswordchangeUI”编辑字段

旧密码、新密码和确认密码

在凭据提供程序的磁贴上。

我正在使用以下代码加载这些组件。

HRESULT hr; ICredentialProviderCredentialEvents*
_pCredProvCredentialEvents;

  hr =
_pCredProvCredentialEvents->SetFieldState((ICredentialProviderCredential*)this,SFI_LOGIN_NAME,CPFS_HIDDEN);  // successfully hides the field.
    hr = _pCredProvCredentialEvents->SetFieldState((ICredentialProviderCredential*)this,SFI_PASSWORD,CPFS_HIDDEN);    // successfully hides the field.

   hr =
_pCredProvCredentialEvents->SetFieldState((ICredentialProviderCredential*)this,SFI_OLDPASSWORD,CPFS_disPLAY_IN_SELECTED_TILE);  // Fails to load the field.

   hr =
_pCredProvCredentialEvents->SetFieldState((ICredentialProviderCredential*)this,SFI_NEWPASSWORD,SFI_CONFPASSWORD,CPFS_disPLAY_IN_SELECTED_TILE); // Fails to load the field.

在上面的代码中,我成功隐藏了 SFI_LOGIN_NAME 和 SFI_PASSWORD 字段, 但我无法显示 SFI_OLDPASSWORD、SFI_NEWPASSWORD 和 SFI_CONFPASSWORD。

如果有人能帮助解决这个问题,我将不胜感激。

问候 阿斯拉姆

解决方法

试试这个序列:

  1. 首先尝试添加新字段。
  2. 将提交按钮重新定位到新字段之一。
  3. 隐藏旧字段。
  4. 返回 CPGSR_NO_CREDENTIAL_NOT_FINISHED 状态以重新激活用户输入字段。

替代方案 - 尝试使用 SFI_PASSWORD 而不是 SFI_OLDPASSWORD