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

2023-12-15

我试图在签名选项中显示所有本地用户和其他用户(域用户)的凭据提供程序,但我无法这样做。我参考以下资料开发了这个凭证提供程序here。我对 CSampleprovider.cpp 文件的 _EnumerateCredentials 和 GetCredentialCount 函数进行了以下更改。

获取凭据计数()

HRESULT 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;
    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;
}

_EnumerateCredentials()

HRESULT CSampleProvider::_EnumerateCredentials()
{
    HRESULT hr = E_UNEXPECTED;


    DWORD dwUserCount;
    if (_pCredProviderUserArray != nullptr)
    {
        //DWORD dwUserCount = 0;
        _pCredProviderUserArray->GetCount(&dwUserCount);
        if (dwUserCount > 0)
        {
            //_pCredential = new CSampleCredential*[dwUserCount];
            for (DWORD i = 0; i < dwUserCount; i++) {
                ICredentialProviderUser* pCredUser;
                hr = _pCredProviderUserArray->GetAt(i, &pCredUser);
                if (SUCCEEDED(hr))
                {
                    //_pCredential[i] = new(std::nothrow) CSampleCredential();
                    _pCredential.push_back(new(std::nothrow) CSampleCredential());
                    if (_pCredential[i] != nullptr)
                    {
                        //logfile << "new CSampleCredential()\n";

                        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();
                }
            }
        }
        //if you are in a domain or have no users on the list you have to show "Other user tile"
        if (DEVELOPING) PrintLn(L"IsOS(OS_DOMAINMEMBER): %d", IsOS(OS_DOMAINMEMBER));
        if ((dwUserCount == 0) || (IsOS(OS_DOMAINMEMBER) == 1)) {
            if (DEVELOPING) PrintLn(L"Adding empty user tile");
            _pCredential.push_back(new(std::nothrow) CSampleCredential());
            if (_pCredential[_pCredential.size() - 1] != nullptr) {
                hr = _pCredential[_pCredential.size() - 1]->Initialize(_cpus, s_rgCredProvFieldDescriptors, s_rgFieldStatePairs, nullptr);
            }
            else {
                if (DEVELOPING) PrintLn(L"Error adding user: %d", _pCredential.size());
            }
        }

        return hr;
    }
}

我已经更改了类型的私有标头CSampleCredential to

std::vector<CSampleCredential> _pCredentialVector; 
// SampleV2CredentialCSampleProvider.h

在 CSampleProvider.h 文件中。

当我测试我的这个凭据提供程序时,它工作正常,即,当没有添加域(没有其他用户)时,它在登录选项中为所有本地用户显示,但当添加域(启用其他用户)时,我就陷入困境欢迎壁纸和屏幕不断闪烁。

那么,如何在登录选项中为所有本地和域用户(其他用户)显示我的凭据提供程序并克服屏幕闪烁。我是 VC++ 新手,请帮助我。


当我尝试为所有磁贴(包括其他用户磁贴)启用自定义凭据提供程序时,我做了一些更改GetCredentialCount()方法和_EnumerateCredentials()Microsoft 提供的凭据提供程序示例中的 SampleProvider.cpp 文件中的方法。我所做的改变是:

HRESULT CServiceProvider::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;
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;}



HRESULT CServiceProvider::_EnumerateCredentials(){
HRESULT hr = E_UNEXPECTED;
DWORD dwUserCount;
if (_pCredProviderUserArray != nullptr)
{
    _pCredProviderUserArray->GetCount(&dwUserCount);
    if (dwUserCount > 0)
    {   
        //You need to initialize all the fields in LogonUI for each and every user 
        for (DWORD i = 0; i < dwUserCount; i++) {
            ICredentialProviderUser* pCredUser;
            hr = _pCredProviderUserArray->GetAt(i, &pCredUser);
            if (SUCCEEDED(hr))
            {
                _pCredential.push_back(new(std::nothrow) CUserCredential());
                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();
            }
        }
    }
    //if you are in a domain or have no users on the list you have to show "Other user tile"
    if ((dwUserCount == 0) || (IsOS(OS_DOMAINMEMBER) == 1)) {
        _pCredential.push_back(new(std::nothrow) CUserCredential());
        if (_pCredential[_pCredential.size() - 1] != nullptr) {
            hr = _pCredential[_pCredential.size() - 1]->Initialize(_cpus, s_rgCredProvFieldDescriptors, s_rgFieldStatePairs, nullptr);
        }
    }
    return hr;
}
return hr;

}

现在如你所见,我们正在发送nullptr作为调用时的参数之一Initialize()检查系统是否连接到域后的方法,我们需要处理它nullptr in Initialize()方法通过检查 SampleCredential.cpp 文件中的 if 条件。

HRESULT CUserCredential::Initialize(CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus,
_In_ CREDENTIAL_PROVIDER_FIELD_DESCRIPTOR const* rgcpfd,
_In_ FIELD_STATE_PAIR const* rgfsp,
_In_ ICredentialProviderUser* pcpUser){
HRESULT hr = S_OK;
_cpus = cpus;
_nNextScreenID = e_ARSNone;

GUID guidProvider;
LPOLESTR clsid;

if (pcpUser != nullptr) {
    pcpUser->GetProviderID(&guidProvider);
    StringFromCLSID(guidProvider, &clsid);
    CoTaskMemFree(clsid);
    _fIsLocalUser = (guidProvider == Identity_LocalUserProvider);
}
else {
    _fIsLocalUser = true;//CP V1 or Domain
}

// Copy the field descriptors for each field. This is useful if you want to vary the field
// descriptors based on what Usage scenario the credential was created for.
for (DWORD i = 0; SUCCEEDED(hr) && i < ARRAYSIZE(_rgCredProvFieldDescriptors); i++)
{
    _rgFieldStatePairs[i] = rgfsp[i];
    hr = FieldDescriptorCopy(rgcpfd[i], &_rgCredProvFieldDescriptors[i]);
}

// Initialize the String value of all the fields.
if (SUCCEEDED(hr))
{
    hr = SHStrDupW(L"SomeLable1", &_rgFieldStrings[SFI_LABEL]);
}

if (SUCCEEDED(hr))
{
    hr = SHStrDupW(L"SomeLable2", &_rgFieldStrings[SFI_LARGE_TEXT]);
}


if (SUCCEEDED(hr))
{
    hr = SHStrDupW(L"", &_rgFieldStrings[SFI_PASSWORD]);
}

if (SUCCEEDED(hr))
{
    hr = SHStrDupW(L"Somelabel4", &_rgFieldStrings[SFI_SUBMIT_BUTTON]);
}


hr = S_OK;
if (SUCCEEDED(hr))
{
    if (pcpUser != nullptr) {
        hr = pcpUser->GetStringValue(PKEY_Identity_QualifiedUserName, &_pszQualifiedUserName);//get username from the LogonUI user object
        PWSTR pszUserName1;
        pcpUser->GetStringValue(PKEY_Identity_UserName, &pszUserName1);
        if (_fIsLocalUser) {
            PWSTR pszUserName;
            pcpUser->GetStringValue(PKEY_Identity_UserName, &pszUserName);
            if (pszUserName != nullptr)
            {
                wchar_t szString[256];
                StringCchPrintf(szString, ARRAYSIZE(szString), L"User Name: %s", pszUserName);
                if (DEVELOPING) PrintLn(szString);
                hr = SHStrDupW(pszUserName, &_rgFieldStrings[SFI_LARGE_TEXT]);
                CoTaskMemFree(pszUserName);
            }
            else
            {
                hr = SHStrDupW(L"User Name is NULL", &_rgFieldStrings[SFI_LARGE_TEXT]);
            }
        }
        else {
            if (DEVELOPING) PrintLn(L"Domain user, skip SFI_LARGE_TEXT");
        }
    }
    else {
        PWSTR connectedDomainName = getNetworkName();
        wchar_t szString[256];
        StringCchPrintf(szString, ARRAYSIZE(szString), L"Sign in to: %s", connectedDomainName);
        hr = SHStrDupW(szString, &_rgFieldStrings[SFI_DOMAIN_NAME_TEXT]);

        if (DEVELOPING) PrintLn("Unknown user -> display LoginName");
        hr = SHStrDupW(L"", &_pszQualifiedUserName);
        _fUserNameVisible = true;
        _rgFieldStatePairs[SFI_LOGIN_NAME].cpfs = CPFS_DISPLAY_IN_SELECTED_TILE;//unhide login name
        //switch focus to login
        _rgFieldStatePairs[SFI_LOGIN_NAME].cpfis = CPFIS_FOCUSED;
        _rgFieldStatePairs[SFI_PASSWORD].cpfis = CPFIS_NONE;
        //Don't panic!!!
    }
}
if (pcpUser != nullptr)
{
    hr = pcpUser->GetSid(&_pszUserSid);
}
return hr;}

使用上面的代码,您可以解决闪烁(这是 CP 崩溃)的问题,并为所有用户图块启用凭据提供程序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未向所有用户显示凭据提供程序(包括其他用户) 的相关文章

  • 批处理文件进度旋转轮

    我已经尝试了好几天了 似乎可以让它发挥作用 我找到了一个例子 但它使用了 CryEcho 但它不起作用 我只是想添加这个 让用户知道在 ping IP 地址时发生了什么事 我确实在这里找到了一些代码 但这让我感到困惑 因为我刚刚开始为了好玩
  • 如何在windows服务中发出HTTP请求? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想实现我的第一个 Windows
  • MFC中如何获取子菜单?

    我正在尝试获取一个子菜单 以便我可以在显示它之前对其进行更改 所以我创建了一个OnInitMenu 我的窗口的处理程序 我本来计划使用pMenu gt GetMenuItemInfo 获取子菜单 然而 这似乎行不通 为了找到我想要的菜单 我
  • Windows Azure 虚拟机在扩展时访问网络速度很慢

    我正在我的小型 azure VM 上运行一些启动脚本 cmd bat 其中包括从已安装的 VHD 进行文件传输操作 通常会在大约 3 分钟内完成 复制文件并使用命令行提取 500Mb zip 文件 7z 当我扩展到约 150 个实例时 相同
  • 如何仅获取窗口的可见部分(Windows、gdi32、user32 等)

    我只想获取窗口中窗口的可见部分 作为一个区域 只想获取用户看到的区域 当然 以编程方式 这是一个例子 我有以下窗口组成 A C
  • 我可以在 Windows Azure 中设置成本上限吗?

    我想设置一个 Windows Azure 帐户 我是 MSDN 订阅者 因此前 16 个月我可以 免费 获得它 尽管如此 微软还是想要我的信用卡号码 以防我超出免费限额 从理论上讲 这意味着我正在向微软写一份全权委托书来向我的信用卡收取费用
  • GDI 已加速。有谁知道这是什么时候发生的?

    概述这个问题的背景 在工作中我们使用 Dell Precision 工作站 我目前的电脑是 NVidia Quadro FX1700 我的团队正在开发实时数据采集系统的图形组件 因此 我们总是留意图形操作是否不会占用太多 CPU 时间 为了
  • 如何在 Windows 窗体应用程序中跟踪 C# 中两次按钮单击之间的时间?

    我已经用 C 创建了一个 Windows 窗体应用程序 其中接受用户的输入 我想计算用户在两次提交之间花费的时间 我该怎么做 Use 跑表 http msdn microsoft com en us library system diagn
  • 使用标准用户帐户在提升的脚本中获取登录用户名

    在 Windows 7 中运行的批处理脚本中 我有几个 IF 子句 例如 IF USERNAME foo GOTO bar 不幸的是 当我运行这个批处理脚本时 用 以管理员身份运行 从上下文菜单中 USERNAME 始终是管理员的用户名 而
  • 如何正确调用 LsaLogonUser 进行交互式登录?

    我正在尝试使用 LsaLogonUser 创建交互式登录会话 但它总是返回STATUS INVALID INFO CLASS 0xc0000003 从网上查到的内存布局KERB INTERACTIVE LOGON结构很棘手 但我很确定我做得
  • Visual C++ 只有一个线程工作 (OpenMP)

    我有一个多线程应用程序的简单代码 但无论我传递多少个线程 它都只使用一个线程执行 起初 我以为是我的电脑的问题 但我又尝试了另一台电脑 但还是不行 我是不是出了什么事 我正在使用 Visual Studio 2015 如果有帮助的话 int
  • 从 .NET 应用程序登录 Windows

    我认为它应该是一个Windows服务 当给定某些条件时 它应该执行登录到机器的操作 机器将在 登录屏幕 中检查网络服务 以了解登录时应使用的用户名和密码 这可以吗 我不想要 自动登录 Windows 功能 Thanks AFAIK 无法完成
  • 如何防止从快照恢复虚拟机时出现“本机与域之间的信任关系失败”错误?

    当您从 足够旧的 快照恢复虚拟机 属于 Windows 域 时 您将收到以下错误 本机与域之间的信任关系失败 发生这种情况是因为域控制器定期更新计算机帐户密码 可能还有其他一些事情 有什么方法可以配置域控制器 或其他任何东西 以防止这种情况
  • 如何在 Windows 路径中使用卷标?

    我想使用批处理文件从可移动驱动器复制文件 无论它获得的驱动器号是什么 到目前为止 还没有去 似乎没有任何现成的命令或第三方命令行工具可以处理基于卷标签的路径 我尝试了 FreeFileSync 但它可以大批量工作 并且我在这里需要精确的文件
  • 如何将 Windows 窗体应用程序 (C++) 设置为具有 Aero/Glass 背景?

    我正在使用 Visual Studio 2010 Pro 用 C 创建 Windows 窗体应用程序 我想创建一个透明背景 即使用 Aero Glass 效果 类似于它围绕 Windows 照片查看器中 UI 底部的方式 此时 我已经查看了
  • 关于 Windows、原始鼠标数据的代码要 #include 哪些内容

    我发现下面的帖子对于做我自己的项目非常有用 那么新手问题是 我必须包含什么才能使其发挥作用 Link 如何准确测量具有已知 DPI 的鼠标的鼠标移动 以英寸或厘米为单位 https stackoverflow com questions 1
  • 适用于 Python 的旧版本 Windows 二进制库 Wheel 的存储库?

    作为很多用户 我使用很棒的Christopher 的 Windows 二进制轮子 http www lfd uci edu gohlke pythonlibs vlfd当尝试在 Windows 上安装一些 python 包 例如 GDAL
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 有适用于 Windows 的 Bonjour SDK 吗?

    我想知道如何在 Windows 上实现 bonjour 以便我可以在 Windows 上设置服务器并使用 iphone 客户端 中的 bonjour 服务访问 Windows 服务器 中的文件 谁能告诉我我们是否有适用于 Windows 的

随机推荐

  • 在另一个函数中访问时函数结果未定义

    我试图取回另一个函数内部函数的结果 但总是未定义 window load function var isMobile false function check OS if iPhone iPod iPad i test navigator
  • JavaScript:在没有画布的情况下获取ImageData

    是否有可能获得ImageData来自图像的对象 该图像不在画布上 而是在 DOM 树中的其他位置 正常情况下 img 如果是 怎么办 您必须创建一个内存画布 然后在此画布上绘制图像 var canvas document createEle
  • 除了“推”钩之外还有其他选择吗?

    Bitbucket Github 和其他服务往往有一个 push 钩子 这样当你将代码推送到存储库时 该服务可以点击一个 URL 可能在生产服务器上 告诉它拉取最新的代码 问题是 如果我在云中有许多服务器 根据负载进出 我无法知道在任何给定
  • QuickBooks 在解析提供的 XML 文本流时发现错误

    我正在使用适用于 QuickBooks Desktop 的 Conolibyte PHP SDK 当我尝试从 QuickBooks 桌面获取账单时 出现此错误 0x80040400 QuickBooks found an error whe
  • 输入类型 DateTime - 值格式?

    我应该以哪种格式放置日期和时间 以便在 HTML5 输入元素中使用datetime type 我努力了 1338575502 01 06 2012 19 31 01 06 2012 19 21 00 2012 06 01 2012 06 0
  • 编辑文件-纯js

    如何在纯js 无节点 中编辑文件 我得到一个带有输入字段的文件 并像这样读取其文本 var fileReader new FileReader fileReader readAsText file fileReader onload fun
  • 受 SO 启发的关系 UML 图

    我的作业是创建一个关于讨论站点的关系 UML 图 我用的是SO模式 我做了一些修改 删除了用户信息中的年龄 添加了代表 允许用户按用户名对帖子进行分类 自愿 除此之外 该模式非常相似 但很初级 你会如何改进它 澄清 代表的主要思想是对职位进
  • 从 IPv4 地址获取网络接口名称

    给定 IPv4 地址 如何在 Windows 中使用 C 获取其关联的网络接口名称 例如 以太网适配器本地连接 或者 如何获取本地计算机的网络接口名称和 IPv4 地址的列表 我只能使用以下命令获取 IPv4 地址getaddrinfo a
  • Yii 验证码 URL 已损坏

    我想在我的 Yii 项目上创建一个 AJAX 注册表单 因此 在每个页面上我都有一个登录按钮 如果用户未经授权 则会显示一个弹出窗口 在该弹出窗口中 他可以看到带有电子邮件字段 密码字段和验证码 默认 Yii 验证码 的注册表单 所以 我的
  • Django 基于类的视图:如何将附加参数传递给 as_view 方法?

    我有一个自定义的基于类的视图 myapp views py from django views generic import class MyView DetailView template name detail html model M
  • Joomla 获取 URL 中传递的变量

    当 Joomla 中的 URL 字符串传递到我们的网站时 我试图从它们中提取值 一个例子是 source SEARCH 20 utm source google utm medium cpc utm term utm content 创意
  • Android Studio、Intel HAXM 找不到已启用但已在 BIOS 中启用的 VT-x

    无法安装 intel HAXM 而是在 BIOS 中启用了 VT 我使用的是 intel core2 四核 q9550 处理器和 Windows 7 我的处理器不支持虚拟机管理程序 这对我有用 不要安装 android studio 附带的
  • 在 Python 中 *zip(list1, list2) 返回什么类型的对象? [复制]

    这个问题在这里已经有答案了 可能的重复 Python 一劳永逸 Python 中的星号运算符是什么意思 x 1 2 3 y 4 5 6 zipped zip x y list zipped x2 y2 zip zip x y x list
  • 在 Itextsharp 中旋转,同时保留注释位置和方向

    总而言之 我使用 Itextsharp 从 PDF 导入特定页面 可能会旋转 调整大小或以其他方式更改该页面 然后将其导出到新的 PDF 中 为此 我使用 Itext 中的 PDFWriter 类 我遇到的问题是 当使用 writer 类时
  • Delphi DBGrid 格式显示值

    我需要格式化值DBGrid以某种格式显示例如 0 00 知道该怎么做吗 问候 彼得 你可以使用显示格式要格式化的字段的属性 检查这个样本 TFloatField YourDataSet FieldByName field DisplayFo
  • 回收ImageView的位图

    我有这样的事情 Bitmap Config conf Bitmap Config ARGB 8888 WeakReference
  • 如何找出渐变中的所有颜色? [复制]

    这个问题在这里已经有答案了 可能的重复 JavaScript 颜色渐变 我有颜色一 比如说黄色 和颜色二 蓝色 它们构成了一个渐变 基于 0 到 100 的值 0 表示黄色 100 表示蓝色 我想表示颜色一和颜色二的混合 我正在尝试在移动浏
  • 默认情况下,从工作线程发出 Qt::signal 会使主线程上的 UI 更新吗?

    我是新来的Qt 我有一个工作线程std thread 工作线程函数在循环中不断地获取一些数据 数据的大小经常更新Text上的元素QML用户界面 我有一个侦听器回调 它只不过是一个std function它被从调用thread s funct
  • ActionListener 被多次调用(错误?) - Mojarra 2.1.3

    我有以下按钮
  • 未向所有用户显示凭据提供程序(包括其他用户)

    我试图在签名选项中显示所有本地用户和其他用户 域用户 的凭据提供程序 但我无法这样做 我参考以下资料开发了这个凭证提供程序here 我对 CSampleprovider cpp 文件的 EnumerateCredentials 和 GetC