C#操作注册表实现添加/删除可信站点
来源:互联网 发布:126smtp服务器端口 编辑:程序博客网 时间:2024/05/16 23:43
最近使用C# WebBrowser开发了一个客户端用来做图形展示,由于项目中引用了中央气象台天气信息的网页,出现了脚本加载不了的问题,费了九牛二虎之力才找出解决方法:添加信任站点。参考网上资料写了一个工具类,现把代码贴出来以供参考。
在IE 工具栏->Internet选项->安全->可信站点->站点 里做添加/删除操作实际上是在操作注册表HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap路径下Domains和Ranges两个节点,如果是普通url,如:http://flash.weather.com.cn,生成的节点如下:
如果是普通IP地址,如:http://10.120.1.1,生成的节点如下:
针对这两种信任站点的不同操作方式需要分别进行处理,代码如下:
using Microsoft.Win32;
/// <summary>
/// 添加/删除 信任站点
/// </summary>
public class OperateTrustSite {
//在注册表添加信任站点
public static void addTrustSite(string url)
{
RegistryKey currentUser = Registry.CurrentUser;//HKEY_CURRENT_USER
string[] parts = url.Split(new char[] { '/' });//将URL拆分,提取协议和url地址
string protocol = parts[0].Substring(0, parts[0].Length - 1);//采用的协议:http/https
///////////判断是普通URL还是IP,普通URL在Domains节点下操作,IP在Ranges节点下操作////////////////
if (isIP(parts[2]))
{
string domainsKeyLocation = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap\\Ranges";
RegistryKey ranges = currentUser.OpenSubKey(domainsKeyLocation, true);
bool has = false;//标识IP是否已经添加
List<string> numbers = new List<string>();//用来存放Range编号
//循环所有的range节点,如果要添加的IP已经存在则不操作,否则添加
foreach (string u in ranges.GetSubKeyNames())
{
numbers.Add(u.Substring("Range".Length));//截取Range1后面的数字1
RegistryKey range = ranges.OpenSubKey(u, true);//以可写的权限打开子节点
//如果该IP地址已经存在
if (range.GetValue(":Range").Equals(parts[2]))
{
has = true;
if (range.GetValue(protocol) != null) break;//如果协议也正确说明IP已经是信任节点
range.SetValue(protocol, 2, RegistryValueKind.DWord);//添加协议对应的值
}
}
//如果该IP没有在信任列表则重新添加
if (!has)
{
RegistryKey range = ranges.CreateSubKey("Range" + findMinNumber(numbers));
range.SetValue(":Range", parts[2], RegistryValueKind.String);
range.SetValue(protocol, 2, RegistryValueKind.DWord);
}
}
/////////////如果不是IP则在Domains节点下操作///////////////
else
{
string domainsKeyLocation = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap\\Domains";
RegistryKey domains = currentUser.OpenSubKey(domainsKeyLocation, true);
string[] urls = parts[2].Split(new char[] { '.' }, 2);
string head = urls[0];//url头部:www/go ...
string tail = urls[1];//url尾部
RegistryKey node = domains.OpenSubKey(tail, true);
//URL没有添加过
if (node == null)
{
node = domains.CreateSubKey(tail);
RegistryKey pnode = node.CreateSubKey(head);
pnode.SetValue(protocol, 2, RegistryValueKind.DWord);//添加协议对应的值
}
else
{
RegistryKey pnode = node.OpenSubKey(head, true);
//如果协议节点不存在
if (pnode == null)
{
pnode = node.CreateSubKey(head);
pnode.SetValue(protocol, 2, RegistryValueKind.DWord);//添加协议对应的值
}
}
}
}
//在注册表删除信任站点
public static void deleteTrustSite(string url)
{
RegistryKey currentUser = Registry.CurrentUser;//HKEY_CURRENT_USER
string[] parts = url.Split(new char[] { '/' });//将URL拆分,提取协议和url地址
string protocol = parts[0].Substring(0, parts[0].Length - 1);//采用的协议:http/https
//判断是普通URL还是IP,普通URL在Domains节点下操作,IP在Ranges节点下操作
if (isIP(parts[2]))
{
string domainsKeyLocation = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap\\Ranges";
RegistryKey ranges = currentUser.OpenSubKey(domainsKeyLocation, true);
//循环所有的range节点,如果要添加的IP已经存在则不操作,否则添加
foreach (string u in ranges.GetSubKeyNames())
{
RegistryKey range = ranges.OpenSubKey(u, true);//以可写的权限打开子节点
//如果该IP地址已经存在
if (range.GetValue(":Range").Equals(parts[2]))
{
if(range.GetValue(protocol)!=null) range.DeleteValue(protocol);//如果协议节点存在则先删除
if (range.GetValueNames().Length == 1) ranges.DeleteSubKey(u);//只剩下“:Range”则将该节点删除
}
}
}
/////////////如果不是IP则在Domains节点下操作///////////////
else
{
string domainsKeyLocation = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap\\Domains";
RegistryKey domains = currentUser.OpenSubKey(domainsKeyLocation, true);
string[] urls = parts[2].Split(new char[] { '.' }, 2);//使用'.'将字符串分成两部分
string head = urls[0];//url头部:www/go ...
string tail = urls[1];//url尾部
RegistryKey node = domains.OpenSubKey(tail);
RegistryKey pnode = node.OpenSubKey(head);
if (pnode != null) node.DeleteSubKey(head);//删除协议节点
if (node.GetSubKeyNames().Length == 0) domains.DeleteSubKey(tail);//如果没有协议节点则删除该URL节点
}
}
/// <summary>
/// 判断一个字符串是否是由数字组成
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
private static bool isNumber(string value)
{
int v = 0;
foreach (char c in value)
{
v = (int)c;
if (v < 48 || v > 57) return false;
}
return true;
}
/// <summary>
/// 判断字符串是否是IP地址
/// </summary>
/// <param name="url">如10.120.1.1</param>
/// <returns></returns>
private static bool isIP(string url)
{
string[] separatedURLs = url.Split(new char[] { '.' });
foreach (string str in separatedURLs)
{
if (!isNumber(str)) return false;//有一个不是数字则该URL不是IP
}
return true;
}
/// <summary>
/// 获取数字列表里从小到大排列最先却少的那个数字,比如numbers里包含2,3时返回1
/// </summary>
/// <param name="numbers">已经使用的数字列表</param>
/// <returns></returns>
private static string findMinNumber(List<string> numbers)
{
for (int i = 1; i <= numbers.Count; i++)
{
if (numbers.IndexOf(i.ToString()) == -1) return i.ToString();
}
return (numbers.Count + 1).ToString();
}
}
- C#操作注册表实现添加/删除可信站点
- c#操作注册表,设置可信站点和Active启用
- js添加可信站点到注册表
- 添加可信站点
- 一:如何添加可信站点?
- IE可信站点对应的注册表项!
- IE可信站点对应的注册表项:
- delphi注册表操作(读取、添加、删除、修改)
- C#为IE添加可信任站点(注册表修改)
- NSIS脚本添加可信站点 (1)
- NSIS脚本添加可信站点 (2)
- C# IE可信站点设置 启用ActiveX
- 注册表操作:添加键值、删除键值、删除子键
- 操作注册表在添加或删除程序中添加项
- 注册表操作(目前主要是删除添加操作)
- C#操作注册表 实现快捷启动程序
- C#操作注册表的实现方法
- C#操作注册表的实现方法
- 如何合理设置Linux的swap分区
- 流程汇总(虚拟机--网络-samba服务器-sshd连接)
- 函数组:SPO1/2/3/4/5/6/8
- 为什么我们程序员难晋升
- 函数组:BUSG(SAP 商业图形库)
- C#操作注册表实现添加/删除可信站点
- 使用HttpClient发送http请求,并解析从服务器端返回的数据
- SystemService
- LTE 中的CQI,PMI,RI上报机制
- java 学习笔记1 之 java 命令行编译和 运行
- linux中的潘多拉! Busybox!
- Isight9.0 desc文件解析
- uml简述
- RCP无法修改程序初始布局