在添加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
#2
看晕了!!
#3
BD
#4
看得有点晕~~~~~~~~~
#5
请问楼主写这个程序的应用场合是什么呢?
#6
是在一个C/S项目中的,目的就是服务端 设置/获取客户端IE受信任站点
#7
Common
#8
#9
http://topic.csdn.net/u/20110707/14/2498A09F-ABE8-41AD-AF5C-6A3288734F4D.html#replyachor
#10
谢谢楼主分享...
#11
请问服务端 设置/获取客户端IE受信任站点是不是要先取得读写客户端注册表的权限?
#12
非常感谢楼主分享
#13
很感谢,尤其是说明。
#14
不错,又学到了
#15
谢谢楼主,做个标记,以后学习。
#16
收藏了
谢谢楼主
谢谢楼主
#17
意义不大,不能自动设置远程客户端。
#18
啥叫自动设置远程客户端?
#19
haha
#20
其实所谓的远程设置不过是服务端向客户端发送相应命令,及参数。设置本身是由客户端来执行的,即修改本地的注册表罢了。
#21
如此深奥~
#22
不明白你说的自动所设置远程客户端
#23
学习!
#24
好东西 ,学习
#25
恶趣味
#26
额玩法二套房
#27
维尔菲尔特而4
#28
copy下来,作为snippet
#29
学习。
#30
学习学习。。
#31
厉害。。。。。。。。。。。。
#32
很厉害的代码阿
#33
哦,这个还是很有意义的。
#34
虽然看不懂,但谢谢楼主
#35
很感谢,尤其是说明。
#36
学习
#37
学习了
#38
这位仁兄写的代码很棒,分析的也很到位,由于鄙人很少使用C,如果转化成C#或者Java那就更好了,这样看起来我会更容易懂点,这是我的一点建议
#39
不错 思想到位!
#40
学习了,真是好方法
#41
不错,好东东
#42
看晕了!!
#43
看晕了!!
#44
很专业的东西,一般人很少用的到,
#45
支持一下!
#46
支持一下!
#47
不能远程设置客户端ie
#48
服务发送命令下去,客户端本地调用设置就可以了。
#49
这个要留名学习
#50
lihai
#1
#2
看晕了!!
#3
BD
#4
看得有点晕~~~~~~~~~
#5
请问楼主写这个程序的应用场合是什么呢?
#6
是在一个C/S项目中的,目的就是服务端 设置/获取客户端IE受信任站点
#7
Common
#8
#9
http://topic.csdn.net/u/20110707/14/2498A09F-ABE8-41AD-AF5C-6A3288734F4D.html#replyachor
#10
谢谢楼主分享...
#11
请问服务端 设置/获取客户端IE受信任站点是不是要先取得读写客户端注册表的权限?
#12
非常感谢楼主分享
#13
很感谢,尤其是说明。
#14
不错,又学到了
#15
谢谢楼主,做个标记,以后学习。
#16
收藏了
谢谢楼主
谢谢楼主
#17
意义不大,不能自动设置远程客户端。
#18
啥叫自动设置远程客户端?
#19
haha
#20
其实所谓的远程设置不过是服务端向客户端发送相应命令,及参数。设置本身是由客户端来执行的,即修改本地的注册表罢了。
#21
如此深奥~
#22
不明白你说的自动所设置远程客户端
#23
学习!
#24
好东西 ,学习
#25
恶趣味
#26
额玩法二套房
#27
维尔菲尔特而4
#28
copy下来,作为snippet
#29
学习。
#30
学习学习。。
#31
厉害。。。。。。。。。。。。
#32
很厉害的代码阿
#33
哦,这个还是很有意义的。
#34
虽然看不懂,但谢谢楼主
#35
很感谢,尤其是说明。
#36
学习
#37
学习了
#38
这位仁兄写的代码很棒,分析的也很到位,由于鄙人很少使用C,如果转化成C#或者Java那就更好了,这样看起来我会更容易懂点,这是我的一点建议
#39
不错 思想到位!
#40
学习了,真是好方法
#41
不错,好东东
#42
看晕了!!
#43
看晕了!!
#44
很专业的东西,一般人很少用的到,
#45
支持一下!
#46
支持一下!
#47
不能远程设置客户端ie
#48
服务发送命令下去,客户端本地调用设置就可以了。
#49
这个要留名学习
#50
lihai