凭证提供者 V2 对所有用户有效(Tiles)
Credential Providers V2 Active for All users(Tiles)
我用的是"Credential Providers in Windows 10"的示例代码。我开发我的代码,修改得很好。
但是我遇到了一些问题:
我的 windows 中的所有用户均未启用(显示磁贴)。 (仅对一位用户显示)
我看到这个问题:
所以我更改了我的代码,但是当从我的 DLL 中使用时,win-login 没有加载,我必须在安全模式下删除,这样我就可以在没有凭据提供程序的情况下进入我的 windows。
我更改我的代码如下:
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;
}
}
}
所以我更改了代码中的其他位置,但没有得到结果。
您必须按照您提到的帖子中的说明进行操作。
作为对 ICredentialProviderSetUserArray::SetUserArray
的间接响应,您必须为提供的列表中的每个用户准备磁贴。
稍后将要求您提供 ICredentialProviderCredential2::GetUserSid
。
您的磁贴必须 return 上一步列表中的 SID 之一。
当我实现这个逻辑时,我不得不重新设计很大一部分代码来支持这个特性。
我阅读了这段代码。这对于了解说明和其他细节非常有帮助。
https://github.com/multiOTP/multiOTPCredentialProvider
此代码 (C++) 为计算机上的所有用户激活 CP。
谢谢
我用的是"Credential Providers in Windows 10"的示例代码。我开发我的代码,修改得很好。
但是我遇到了一些问题:
我的 windows 中的所有用户均未启用(显示磁贴)。 (仅对一位用户显示)
我看到这个问题:
所以我更改了我的代码,但是当从我的 DLL 中使用时,win-login 没有加载,我必须在安全模式下删除,这样我就可以在没有凭据提供程序的情况下进入我的 windows。
我更改我的代码如下:
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;
}
}
}
所以我更改了代码中的其他位置,但没有得到结果。
您必须按照您提到的帖子中的说明进行操作。
作为对 ICredentialProviderSetUserArray::SetUserArray
的间接响应,您必须为提供的列表中的每个用户准备磁贴。
稍后将要求您提供 ICredentialProviderCredential2::GetUserSid
。
您的磁贴必须 return 上一步列表中的 SID 之一。
当我实现这个逻辑时,我不得不重新设计很大一部分代码来支持这个特性。
我阅读了这段代码。这对于了解说明和其他细节非常有帮助。
https://github.com/multiOTP/multiOTPCredentialProvider
此代码 (C++) 为计算机上的所有用户激活 CP。
谢谢