一、前言

写下本文是因为客户提出能不能直接在浏览器里向控制面板中的凭据管理器添加指定IP的功能。
在中文引擎搜索了很久没发现相关的资料记录,最后在 stackoverflow上搜索到了相关解决方案,不过问题描述只是在c++程序里实现功能,将其移到qt也还是有一些细节需要处理,遂记录下来,提供给以后遇到相似需求的朋友参考。

二、需求分析

客户需要配置凭据管理器目的是验证IP和账号密码,可以通过浏览器访问ASITE查看影像,即为了能直接访问某些服务,而不需要重复输入账户和密码。然后以上功能希望可以直接在浏览器一键开启。

三、涉及概念

1、凭据管理器

凭据管理器是Win7系统的一个系统组件,能够帮助用户完成本地访问时的认证工作。当用户第一次输入用户名和密码的时候,凭证管理器可以将这些访问凭据(用户、密码、证书等)保存在本地,再次访问该服务器站点时,Win7系统会自动完成凭据的认证过程。

凭据管理器使你能够查看和删除用于登录网站、连接的应用程序和网络的已保存凭据。
1 若要打开凭据管理器,请在任务栏上的搜索框中键入“凭据管理器”,然后选择“凭据管理器控制面板”。
2 选择“Web 凭据”或“Windows 凭据”以访问要管理的凭据。

2、 Windows API

Windows API(Windows Application Program Interface,应用程序接口)是一系列接口函数、宏、数据类型、数据结构的集合,运行于Windows操作系统的应用程序可以使用其提供的接口来实现应用程序所要的功能。

四、代码实现

1. 通过什么方法将信息写入凭据管理器?

1、注册表?
一开始设想的是凭据管理器的数据会不会存在注册表里面。希望直接通过qt的QSettings *reg = new QSettings(pash, QSettings::NativeFormat);来实现写注册表,最后查找了大量资料发现凭据管理器的信息并不是存在于注册表,而是存储于X:\windows\system32\config\sam文件中(此路径未验证),但是存储的密码是经过不可逆加密算法处理的。此思路不通。

2、歪打正着之 Windows API
继续艰难的在中文引擎搜索相关资料,直到看到某个网站翻译了stackoverflow的问题信息到,然后贴了参考原博,才发现原来可以使用 Windows API 来实现这个功能。
参考源地址:How do I store and retrieve credentials from the Windows Vault credential manager? - Stack Overflow

从问题的最高赞同回答的源码如下(添加了注释):

#include <windows.h>
#include <wincred.h> //This header is used by Security and Identity.凭据就需要此头文件包含的函数。
#include <tchar.h>
#pragma hdrstopint main ()
{{ //--- SAVEchar* password = "brillant";DWORD cbCreds = 1 + strlen(password); //凭据类型是普通凭据时需要+1//DWORD cbCreds = strlen(password);       凭据类型是windows凭据时不需要+1CREDENTIALW cred = {0};cred.Type = CRED_TYPE_GENERIC;        //类型:普通凭据   CRED_TYPE_DOMAIN_PASSWORD//cred.Type =CRED_TYPE_DOMAIN_PASSWORD;  这样可以定义 Windows凭据cred.TargetName = L"127.0.0.1";cred.CredentialBlobSize = cbCreds;cred.CredentialBlob = (LPBYTE) password;cred.Persist = CRED_PERSIST_LOCAL_MACHINE;  //凭据持久性 cred.UserName = L"paula";BOOL ok = ::CredWriteW (&cred, 0);wprintf (L"CredWrite() - errno %d\n", ok ? 0 : ::GetLastError());if (!ok) exit(1);}{ //--- RETRIEVEPCREDENTIALW pcred;BOOL ok = ::CredReadW (L"FOO/account", CRED_TYPE_GENERIC, 0, &pcred);wprintf (L"CredRead() - errno %d\n", ok ? 0 : ::GetLastError());if (!ok) exit(1);wprintf (L"Read username = '%s', password='%S' (%d bytes)\n", pcred->UserName, (char*)pcred->CredentialBlob, pcred->CredentialBlobSize);// Memory allocated by CredRead() must be freed!::CredFree (pcred);}
}

用于存储凭据并从Windows 读取凭据的Windows API函数是CredWrite()和CredRead()。
wincred.h头文件包含了这两个函数。

通过修改删除,将上述源码实现的功能封装成函数写入qt项目的cpp文件里。函数如下:

int addcredential(LPWSTR targetname, LPWSTR username,const char* password)
{DWORD blobSize = strlen(password);CREDENTIALW cred = { 0 };cred.Type = CRED_TYPE_DOMAIN_PASSWORD;cred.TargetName = targetname;cred.CredentialBlobSize = blobSize;cred.CredentialBlob = (LPBYTE)password;cred.Persist = CRED_PERSIST_LOCAL_MACHINE;cred.UserName = username;BOOL ok = ::CredWriteW(&cred, 0);wprintf(L"CredWrite() - errno %d\n", ok ? 0 : ::GetLastError());if (!ok) return -1;return 0;
}

当用户通过qt输入相关信息后触发槽函数

void Qcredential::on_pushButton_saveCredential_clicked()
{LPWSTR target = ConvertCharToLPWSTR(QStringtoChar(address));LPWSTR name = ConvertCharToLPWSTR(QStringtoChar(username));const char* pd = QStringtoChar(password);//凭据信息写入int rn = addcredential(target,name,pd);if(rn != 0) {QMessageBox::warning(this, "Warning",u8"添加凭据失败,请重新添加");}else{QMessageBox::information(this, "Succeed", u8"凭据添加成功");}this->close();
}

2.数据类型转换

因为我在qt是通过lineEdit控件来获得用户输入信息,而通过函数text()获得的值类型为QString。而凭据输入需要的几个核心数据为LPWSTRconst char*类型,所以需要类型转换。

1)QString转const char*

const char* QStringtoChar(QString  filename){QByteArray ba = filename.toLatin1();const char *s = ba.data();return s;
}

2)const char *转 LPWSTR

LPWSTR ConvertCharToLPWSTR(const char * szString)
{int dwLen = strlen(szString) + 1;int nwLen = MultiByteToWideChar(CP_ACP, 0, szString, dwLen, NULL, 0);//算出合适的长度LPWSTR lpszPath = new WCHAR[dwLen];MultiByteToWideChar(CP_ACP, 0, szString, dwLen, lpszPath, nwLen);return lpszPath;
}

五、结语

至此,实现了在QT里通过用户输入信息而写入凭据管理器的功能。实现过程参考了很多其他博主和问答论坛的回答,感谢互联网。也希望本文能帮助到其他人,如需转载请标注文章地址和作者,谢谢。

六、参考链接

  • 百科:凭据管理器
  • 《Windows API开发》:(一)Windows编程概述
  • Win7网络凭据里面的账户密码存在哪个文件,能提取出来吗_百度知道 (baidu.com)
  • C++:如何在 Windows 凭据管理器中以编程方式创建本地用户登录凭据,以便 "runas/savecred"可以使用它?
  • security - How do I store and retrieve credentials from the Windows Vault credential manager? - Stack Overflow
  • CREDENTIALA (wincred.h) - Win32 apps
  • QString与char*的相互转换

【QT】将指定ip添加到凭据管理器相关推荐

  1. 【Windows 7中的凭据管理器的功能】

    在登录远程计算机或者访问站点时,我们通常要输入用户名和密码信息.这些重复性的系统之家操作会影响我们的工作效率和使用体验,其实对于本地用户来说我们完全可以将这些访问凭据(用户.密码.证书等)保存在本地, ...

  2. 安卓应用安全指南 5.3.2 将内部账户添加到账户管理器 规则书

    5.3.2 将内部账户添加到账户管理器 规则书 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY- ...

  3. 安卓应用安全指南 5.3.1 将内部账户添加到账户管理器 示例代码

    5.3.1 将内部账户添加到账户管理器 示例代码 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY ...

  4. 决手动打开凭据管理器报0x80070005错误的问题-CMD方式

    命令行添加凭据管理器(可以解决手动打开凭据管理器报0x80070005错误的问题) 通过DOS批处理实现添加或删除Windows凭证_Lyy's Blog-CSDN博客_cmd添加凭据

  5. windows 10 windows凭据管理器使用已记录的密码

    windows 10 windows凭据管理器使用已记录的密码 之前电脑上有用户的服务器密码,但换地方办公了,忘了密码了. 备份,然后根据提示设置密码,然后拷贝到新电脑. 然后远程输入你那个ip,就不 ...

  6. 安卓应用安全指南 5.3.3 将内部账户添加到账户管理器 高级话题

    5.3.3 将内部账户添加到账户管理器 高级话题 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY ...

  7. Windows凭据管理器

    可以进入设备管理器查看Windows凭据管理器.能够帮助用户完成本地访问时的认证工作.当用户第一次输入用户名和密码的时候,凭证管理器可以将这些访问凭据(用户.密码.证书等)保存在本地,再次访问该服务器 ...

  8. Git跨团队协作和Win7凭据管理器

    1 简介 Git的一大优点就是可以整合全世界的开发人员,当然在公司内部,使用Git多是作为版本管理工具,作为团队内协作并行开发的工作,而Git的另外一个极为大的应用,便是跨团队协作,一种可能的情形是单 ...

  9. Windows 8 引入新版的凭据管理器

    Windows 8 引入了账户同步功能,默认情况下系统的设置,IE的浏览记录等等信息都会绑定到微软账户当中,在使用该账户登录之后会后台自动同步相关内容.和个人安全相关的就是,在浏览器当中保存的用于网站 ...

最新文章

  1. 写给新手:2021版调参上分手册!
  2. 为什么2G/3G和AI擦不出火花?他们用这篇论文告诉你答案
  3. oracle设计自增列,oracle中实现自增列
  4. win 7 DHCP获取不到ip的解决办法
  5. ACM MM 2021 | 面向多模态情绪识别的双流异质图递归神经网络
  6. Eclipse And Android 使用心得
  7. PHP---错误处理(error)
  8. 建筑电气工程设计常用图形和文字符号_建筑水电图纸看不懂?10年老师傅教你看图技巧,分分钟安排...
  9. python中msg是什么意思_python下载.msg文件的附件
  10. Windows Media Services 9 系列常见问题解答
  11. Asp.Net如何实现发送邮件 -详解
  12. Python 这么简单还用学吗?
  13. CentOS配置国内(阿里云)镜像加速器
  14. Typora保留文本格式
  15. 安卓微信支付回调出现白页面
  16. linux中package什么文件夹,PACKAGE 文件扩展名: 它是什么以及如何打开它?
  17. [UE4]计算小地图比例尺
  18. SpringSecurity多种认证方式记录之自定义
  19. Windows10下安装Gromacs2020
  20. php获取企业微信聊天内容,微信企业号开发获取用户信息的介绍

热门文章

  1. 记录docker failed to initialize docker desktop is shutting down解决办法
  2. softmax的从零开始实现
  3. Springboot中国古代史在线学习网站 毕业设计-附源码260839
  4. 你们还不了解YUM的使用?那就看看这篇文章把~
  5. PHP正则表达式笔记与实例详解
  6. 北京市中 高英语听说计算机考,北京2018中考英语听说计算机考试工作通知
  7. 照片上传分辨率低怎么改?图片分辨率dpi怎么调?
  8. 这些华为技巧,花粉都不一定全知道
  9. 一种基于优先级轮询调度负载均衡的crossbar结构
  10. 【Docker】11、IDEA集成Docker插件实现一键部署SpringBoot项目