- C++ 启用或关闭TLS功能
- 前言
- 一、原理
- 二、代码
- 三、测试
前言
之所以发布这篇文章,是因为在使用HP smart打印软件的时候老进不去,网上查了百度说是TLS没打开,所以我就按照百度的方法再IE中进行打开,但是老是过段时间就又不行了,不知道被那个东西给关闭了。索性我就写个程序在启动HP SMART软件前自动打开。
一、原理直接上图分析
就是直接操作注册表,网上百度出来的都是win7的。所以只能自己去调式IE了.TLS的功能位数是用火绒程序注册表监控来测试IE浏览器而得出的。这是基于windows10系统的注册表路径。win7可自行百度。
#include三、测试#include #include #include #define TLS1_0 7 #define TLS1_1 9 #define TLS1_2 11 //得到登录用户的SID用于拼接注册表路径 BOOL GetLoginSid(WCHAR ** curSID) { BOOL ret = FALSE; HANDLE hToken; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken)) { _tprintf(L"token打开失败n"); return ret; } DWORD cbSize; SID* sid; TOKEN_USER* User; cbSize = 0; GetTokenInformation(hToken, TokenUser, NULL, 0, &cbSize); if (!cbSize) { _tprintf(L"token信息查询失败n"); return ret; } User = (TOKEN_USER*)malloc(cbSize); GetTokenInformation(hToken, TokenUser, User, cbSize, &cbSize); ret=ConvertSidToStringSid(User->User.Sid, curSID); free(User); return ret; } BOOL RegTLSFunChange(WCHAR * curSID,DWORD bitIndex,BOOL open) { BOOL ret = FALSE; const HKEY key = HKEY_USERS; WCHAR subKey[128] = { 0 }; const wchar_t* const subKeyAfter = L"\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings"; wcscat_s(subKey, curSID); wcscat_s(subKey, subKeyAfter); const wchar_t* const valueName = L"SecureProtocols"; DWORD result; DWORD retSize = sizeof(DWORD); RegGetValue(key,subKey,valueName,RRF_RT_DWORD,NULL,&result,&retSize); if(open) result = result | (1 << bitIndex); else result = result & ~(1 << bitIndex); HKEY openKey; RegOpenKeyEx(key, subKey, NULL, KEY_READ | KEY_WRITE, &openKey); if (RegSetValueEx(openKey, valueName, NULL, REG_DWORD, (BYTE*)&result, retSize) == ERROR_SUCCESS) ret = true; return true; } int main() { setlocale(LC_ALL, ".utf8"); WCHAR* curSID; GetLoginSid(&curSID); if (RegTLSFunChange(curSID, TLS1_2, TRUE)) { _tprintf(L"注册表操作成功n"); system("start HP-SMART:"); } else _tprintf(L"注册表操失败n"); system("pause"); }
在关闭TLS1.2的时候,程序一直进不去。
启用TLS1.2后重启软件即可正常进入



