分享:添加/获取IE受信任站点

时间:2022-11-24 14:25:30
    之前在写获取IE受信任站点时,发现诸多麻烦,需分域名形式及IP形式站点分别设置。
    在添加IP形式的站点时出现成功写入注册表,但是在Internet选项中信任站点列表中看不到新增的站点。折腾很久后,终于找到原因,在添加IP类站点时,需写入2项注册表值,必须先设置DWORD类型的值,再设置字符串类型的值,具体查看代码。在此分享,希望有碰到类似问题的童鞋可以得到解决。
    另外,还做了进一步扩展,可添加受信任/受限制站点,关于函数第一个参数 HKEY hKey 的说明,一般来说该项为HKEY_CURRENT_USER 即可,但有这么一种情况,若是在服务程序中调用,因为服务程序的用户是SYSTEM,因此可能设置不到当前登录系统的用户,特将该参数独立出来,获取到正确的 hKey 后传入即可。
    由于添加时域名形式站点时,规则颇多,总结了大部分,不知道是否完整,欢迎大家补充。另有不足的地方还请多多指教


/************************************************************************/
/* 添加站点                                                             
/* DWORD dwType 2--受信任站点  4--受限制站点
/************************************************************************/
BOOL SetTrustfulUrl(HKEY hKey, char *szUrl, DWORD dwType)
{
HKEY hkResult;

int rc = 0;
char *p = NULL;
char szProtocol[MAX_PATH] = {0};
char szData[MAX_PATH] = {0};
char szTemp[MAX_PATH] = {0};

char szRegPath[MAX_PATH] = {0};

strcpy(szTemp, szUrl);
//获取协议
p = strchr(szTemp, ':');

if (p != NULL)
{
*p = '\0';
strcpy(szProtocol, szTemp);
p += 3;
strcpy(szTemp, p);
}
else
{
strcpy(szProtocol, "*");
}

//去除多余的url
p = strrchr(szTemp, '/');
if (p != NULL)
{
*p = '\0';
}

//判断是IP还是域名
if (IsIP(szTemp)) //IP类站点添加
{
DWORD dwKeys = 0;

sprintf(szRegPath, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap\\Ranges");

rc = RegCreateKey(hKey, szRegPath, &hkResult);
//先获取该key下有多少个项
rc = RegQueryInfoKey(hkResult, NULL, NULL, NULL, &dwKeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL);

RegCloseKey(hkResult);
hkResult = NULL;

if (rc != ERROR_SUCCESS)
{
return FALSE;
}
else
{
sprintf(szRegPath, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap\\Ranges\\Range%d", dwKeys+10);

rc = RegCreateKey(hKey, szRegPath, &hkResult);
//必须要先创建DWORD值,再创建字符串值,否则不能在Internet选项中信任站点列表中显示
RegSetValueEx(hkResult, szProtocol, NULL, REG_DWORD, (BYTE *)&dwType, sizeof(DWORD));
RegSetValueEx(hkResult, ":Range", NULL, REG_SZ, (BYTE *)&szTemp, strlen(szTemp));

RegCloseKey(hkResult);
hkResult = NULL;
}
}
else //域名类站点添加
{
p = strrchr(szTemp, '.');

if (p == NULL)
{
sprintf(szRegPath, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap\\Domains\\%s", szTemp);

else
{
char szTempStr[MAX_PATH] = {0};
strcpy(szTempStr, p);

*p = '\0';
p = strrchr(szTemp, '.');
if (p == NULL)
{
sprintf(szRegPath, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap\\Domains\\%s%s", szTemp, szTempStr);
}
else
{
*p = '\0';
p++;
sprintf(szRegPath, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap\\Domains\\%s%s\\%s", p, szTempStr, szTemp);
}
}

rc = RegCreateKey(hKey, szRegPath, &hkResult);
RegSetValueEx(hkResult, szProtocol, NULL, REG_DWORD, (BYTE*)&dwType, sizeof(DWORD));

RegCloseKey(hkResult);
hkResult = NULL;
}

return TRUE;
}

/************************************************************************/
/* 获取站点                                                         
/* DWORD dwType 2--受信任站点   4--受限制站点
/************************************************************************/
BOOL GetTrustfunUrl(HKEY hKey, char *szUrl, DWORD dwType)
{
int rc = 0;
int rc2 = 0;
int rc3 = 0;
int index = 0;
int subIndex = 0;
int protocolIndex = 0;
HKEY hkResult;
HKEY hkSubKey;
HKEY hkHost;
char szKeyName[MAX_PATH] = {0};
char szHost[MAX_PATH] = {0};
char szTemp[MAX_PATH] = {0};
char szProtocol[MAX_PATH] = {0};
// char szUrl[MAX_PATH] = {0};
DWORD dwProtocol = 0;
DWORD dwKeys = 0;
DWORD dwData = 0;
DWORD dwLen = sizeof(DWORD);

//获取域名形式站点
rc = RegCreateKey(hKey, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap\\Domains", &hkResult);

while (RegEnumKey(hkResult, index, szKeyName, MAX_PATH) == ERROR_SUCCESS)
{
if (RegOpenKey(hkResult, szKeyName, &hkSubKey) == ERROR_SUCCESS)
{
rc = RegQueryInfoKey(hkSubKey, NULL, NULL, NULL, &dwKeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL);

//如果该项下没有子项,即没有主机名,表示为 *.xx.xxx
if (dwKeys < 1)
{
dwProtocol = sizeof(szProtocol);
protocolIndex = 0;
while (RegEnumValue(hkSubKey, protocolIndex, szProtocol, &dwProtocol, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
{
if (strcmp(szProtocol, "*") == 0)
{
sprintf(szTemp, "*.%s", szKeyName);
}
else
{
sprintf(szTemp, "%s://*.%s", szProtocol, szKeyName);
}
strcat(szUrl, szTemp);
strcat(szUrl, ",");

memset(szTemp, 0, MAX_PATH);

if (strlen(szUrl) > 200) //此处做了长度限制,可根据需要自行修改
{
*strrchr(szUrl, ',') = '\0';
return TRUE;
}

protocolIndex ++;
memset(szProtocol, 0, MAX_PATH);


}
else
{
subIndex = 0;
while (RegEnumKey(hkSubKey, subIndex, szHost, MAX_PATH) == ERROR_SUCCESS) 
{
if (RegOpenKey(hkSubKey, szHost, &hkHost) == ERROR_SUCCESS)
{
dwProtocol = sizeof(szProtocol);
protocolIndex = 0;
while (RegEnumValue(hkHost, protocolIndex, szProtocol, &dwProtocol, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
{
RegQueryValueEx(hkHost, szProtocol, NULL, NULL, (LPBYTE)&dwData, &dwLen);

if (dwData == dwType)
{
if (strcmp(szProtocol, "*") == 0)
{
sprintf(szTemp, "%s.%s", szHost, szKeyName);
}
else
{
sprintf(szTemp, "%s://%s.%s", szProtocol, szHost, szKeyName);
}

strcat(szUrl, szTemp);
strcat(szUrl, ",");

memset(szTemp, 0, MAX_PATH);

if (strlen(szUrl) > 200)
{
RegCloseKey(hkHost);
RegCloseKey(hkSubKey);
RegCloseKey(hkResult);
hkHost = NULL;
hkSubKey = NULL;
hkResult = NULL;

*strrchr(szUrl, ',') = '\0';
return TRUE;
}
}

protocolIndex ++;
memset(szProtocol, 0, MAX_PATH);


RegCloseKey(hkHost);
hkHost = NULL;
}

subIndex ++;
memset(szHost, 0, MAX_PATH);

}

RegCloseKey(hkSubKey);
hkSubKey = NULL;
}

index ++;
memset(szKeyName, 0, MAX_PATH);


RegCloseKey(hkResult);
hkResult = NULL;

//获取IP形式站点
rc = RegCreateKey(hKey, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap\\Ranges", &hkResult);

index = 0;
while (RegEnumKey(hkResult, index, szKeyName, MAX_PATH) == ERROR_SUCCESS)
{
if (RegOpenKey(hkResult, szKeyName, &hkSubKey) == ERROR_SUCCESS)
{
DWORD dwHost = MAX_PATH;
RegQueryValueEx(hkSubKey, ":Range", NULL, NULL, (LPBYTE)szHost, &dwHost);

subIndex = 0;
dwProtocol = sizeof(szProtocol);
while (RegEnumValue(hkSubKey, subIndex, szProtocol, &dwProtocol, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
{
if (strcmp(szProtocol, ":Range") != 0)
{
RegQueryValueEx(hkSubKey, szProtocol, NULL, NULL, (LPBYTE)&dwData, &dwLen);

if (dwData == dwType)
{
if (strcmp(szProtocol, "*") == 0)
{
sprintf(szTemp, "%s", szHost);
}
else
{
sprintf(szTemp, "%s://%s", szProtocol, szHost);
}

strcat(szUrl, szTemp);
strcat(szUrl, ",");
}

memset(szTemp, 0, MAX_PATH);

if (strlen(szUrl) > 200)
{
RegCloseKey(hkSubKey);
RegCloseKey(hkResult);
hkSubKey = NULL;
hkResult = NULL;

*strrchr(szUrl, ',') = '\0';
return TRUE;
}
}

subIndex++;
memset(szProtocol, 0, MAX_PATH);
}

RegCloseKey(hkSubKey);
hkSubKey = NULL;
}

index ++;
memset(szKeyName, 0, MAX_PATH);
}

RegCloseKey(hkResult);
hkResult = NULL;

*strrchr(szUrl, ',') = '\0';
return TRUE;
}

//判断是否是IP
BOOL IsIP(char *szIP)
{
if (strlen(szIP) == 0)
{
return FALSE;
}

int ip_part1 = 0;
int ip_part2 = 0;
int ip_part3 = 0;
int ip_part4 = 0;

if (sscanf(szIP, "%d.%d.%d.%d", &ip_part1, &ip_part2, &ip_part3, &ip_part4) != 4)
{
return FALSE;
}

if (!((ip_part1 >= 0 && ip_part1 <= 255) && (ip_part2 >= 0 && ip_part2 <= 255) && (ip_part3 >= 0 && ip_part3 <= 255) && (ip_part4 >= 0 && ip_part4 <= 255)))
{
return FALSE;
}

return TRUE;
}

61 个解决方案

#1


分享:添加/获取IE受信任站点

#2


看晕了!!

#3


BD  分享:添加/获取IE受信任站点

#4


看得有点晕~~~~~~~~~

#5


     请问楼主写这个程序的应用场合是什么呢?

#6


引用 5 楼 clever101 的回复:
     请问楼主写这个程序的应用场合是什么呢?


是在一个C/S项目中的,目的就是服务端 设置/获取客户端IE受信任站点

#7


引用 3 楼 chenchenyangll 的回复:
BD

Common

#8


分享:添加/获取IE受信任站点

#9


引用 7 楼 mmcgzs 的回复:
引用 3 楼 chenchenyangll 的回复:
BD

Common


http://topic.csdn.net/u/20110707/14/2498A09F-ABE8-41AD-AF5C-6A3288734F4D.html#replyachor

#10


谢谢楼主分享...

#11


引用 6 楼 jagin 的回复:
引用 5 楼 clever101 的回复:

请问楼主写这个程序的应用场合是什么呢?


是在一个C/S项目中的,目的就是服务端 设置/获取客户端IE受信任站点


     请问服务端 设置/获取客户端IE受信任站点是不是要先取得读写客户端注册表的权限?

#12


非常感谢楼主分享

#13


很感谢,尤其是说明。

#14


不错,又学到了

#15


谢谢楼主,做个标记,以后学习。

#16


收藏了
谢谢楼主

#17


意义不大,不能自动设置远程客户端。

#18


引用 17 楼 funniest 的回复:
意义不大,不能自动设置远程客户端。


   啥叫自动设置远程客户端?

#19


引复:
非常感谢楼主分享
呵呵

haha 

#20


引用 11 楼 clever101 的回复:
引用 6 楼 jagin 的回复:

引用 5 楼 clever101 的回复:

请问楼主写这个程序的应用场合是什么呢?


是在一个C/S项目中的,目的就是服务端 设置/获取客户端IE受信任站点


     请问服务端 设置/获取客户端IE受信任站点是不是要先取得读写客户端注册表的权限?



其实所谓的远程设置不过是服务端向客户端发送相应命令,及参数。设置本身是由客户端来执行的,即修改本地的注册表罢了。

#21


如此深奥~

#22


引用 17 楼 funniest 的回复:
意义不大,不能自动设置远程客户端。


不明白你说的自动所设置远程客户端

#23


学习!

#24


好东西  ,学习

#25


恶趣味

#26


额玩法二套房

#27


维尔菲尔特而4

#28


copy下来,作为snippet

#29


学习。

#30


学习学习。。

#31


厉害。。。。。。。。。。。。

#32


很厉害的代码阿

#33


哦,这个还是很有意义的。

#34


虽然看不懂,但谢谢楼主

#35


很感谢,尤其是说明。
分享:添加/获取IE受信任站点

#36


学习 分享:添加/获取IE受信任站点

#37


学习了

#38


这位仁兄写的代码很棒,分析的也很到位,由于鄙人很少使用C,如果转化成C#或者Java那就更好了,这样看起来我会更容易懂点,这是我的一点建议

#39


不错 思想到位!

#40


学习了,真是好方法

#41


不错,好东东

#42


看晕了!!

#43


看晕了!!

#44


很专业的东西,一般人很少用的到,

#45


支持一下!

#46


支持一下!

#47


不能远程设置客户端ie

#48


引用 47 楼 zzxap 的回复:
不能远程设置客户端ie


服务发送命令下去,客户端本地调用设置就可以了。

#49


这个要留名学习

#50


lihai

#1


分享:添加/获取IE受信任站点

#2


看晕了!!

#3


BD  分享:添加/获取IE受信任站点

#4


看得有点晕~~~~~~~~~

#5


     请问楼主写这个程序的应用场合是什么呢?

#6


引用 5 楼 clever101 的回复:
     请问楼主写这个程序的应用场合是什么呢?


是在一个C/S项目中的,目的就是服务端 设置/获取客户端IE受信任站点

#7


引用 3 楼 chenchenyangll 的回复:
BD

Common

#8


分享:添加/获取IE受信任站点

#9


引用 7 楼 mmcgzs 的回复:
引用 3 楼 chenchenyangll 的回复:
BD

Common


http://topic.csdn.net/u/20110707/14/2498A09F-ABE8-41AD-AF5C-6A3288734F4D.html#replyachor

#10


谢谢楼主分享...

#11


引用 6 楼 jagin 的回复:
引用 5 楼 clever101 的回复:

请问楼主写这个程序的应用场合是什么呢?


是在一个C/S项目中的,目的就是服务端 设置/获取客户端IE受信任站点


     请问服务端 设置/获取客户端IE受信任站点是不是要先取得读写客户端注册表的权限?

#12


非常感谢楼主分享

#13


很感谢,尤其是说明。

#14


不错,又学到了

#15


谢谢楼主,做个标记,以后学习。

#16


收藏了
谢谢楼主

#17


意义不大,不能自动设置远程客户端。

#18


引用 17 楼 funniest 的回复:
意义不大,不能自动设置远程客户端。


   啥叫自动设置远程客户端?

#19


引复:
非常感谢楼主分享
呵呵

haha 

#20


引用 11 楼 clever101 的回复:
引用 6 楼 jagin 的回复:

引用 5 楼 clever101 的回复:

请问楼主写这个程序的应用场合是什么呢?


是在一个C/S项目中的,目的就是服务端 设置/获取客户端IE受信任站点


     请问服务端 设置/获取客户端IE受信任站点是不是要先取得读写客户端注册表的权限?



其实所谓的远程设置不过是服务端向客户端发送相应命令,及参数。设置本身是由客户端来执行的,即修改本地的注册表罢了。

#21


如此深奥~

#22


引用 17 楼 funniest 的回复:
意义不大,不能自动设置远程客户端。


不明白你说的自动所设置远程客户端

#23


学习!

#24


好东西  ,学习

#25


恶趣味

#26


额玩法二套房

#27


维尔菲尔特而4

#28


copy下来,作为snippet

#29


学习。

#30


学习学习。。

#31


厉害。。。。。。。。。。。。

#32


很厉害的代码阿

#33


哦,这个还是很有意义的。

#34


虽然看不懂,但谢谢楼主

#35


很感谢,尤其是说明。
分享:添加/获取IE受信任站点

#36


学习 分享:添加/获取IE受信任站点

#37


学习了

#38


这位仁兄写的代码很棒,分析的也很到位,由于鄙人很少使用C,如果转化成C#或者Java那就更好了,这样看起来我会更容易懂点,这是我的一点建议

#39


不错 思想到位!

#40


学习了,真是好方法

#41


不错,好东东

#42


看晕了!!

#43


看晕了!!

#44


很专业的东西,一般人很少用的到,

#45


支持一下!

#46


支持一下!

#47


不能远程设置客户端ie

#48


引用 47 楼 zzxap 的回复:
不能远程设置客户端ie


服务发送命令下去,客户端本地调用设置就可以了。

#49


这个要留名学习

#50


lihai