C# .NET 操作Windows hosts

工具类HostsUtil:

using System;
using System.IO;
using System.Text; namespace CommonUtils
{
public static class HostsUtil
{
public static string GetHostFileFullName()
{
string abc = Environment.GetEnvironmentVariable("systemroot");
string fileName = Path.Combine(abc, @"System32\drivers\etc\hosts"); return fileName;
} /// <summary>
/// 域名是否存在
/// </summary>
/// <param name="hostsLineValue">格式:api.yun.comn</param>
/// <returns></returns>
public static bool IsDomainEx(string inputValue)
{
string fileName = GetHostFileFullName(); //兼容 IP+空格+域名
string domain = inputValue;
if (!string.IsNullOrEmpty(inputValue) && inputValue.Trim().Contains(" "))
{
var hostLineArray = inputValue.Trim().Split(' ');
if (hostLineArray.Length > 1)
{
domain = hostLineArray[1];
}
} using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
using (StreamReader sr = new StreamReader(fs, Encoding.UTF8))
{
while (sr.Peek() >= 0)
{
string curLine = sr.ReadLine();
if (!string.IsNullOrEmpty(curLine) && !curLine.Trim().StartsWith("#"))
{
var hostLineArray = curLine.Trim().Split(' ');
if (hostLineArray.Length > 1)
{
string lineDomain = hostLineArray[1];
if (!string.IsNullOrEmpty(lineDomain) && lineDomain.Trim() == domain)
{
return true;
}
}
}
}
}
}
return false;
} /// <summary>
/// 删除域名绑定
/// </summary>
/// <param name="hostsLineValue">格式:api.yun.comn</param>
/// <returns></returns>
public static bool Del(string inputValue)
{
string fileName = GetHostFileFullName(); if (!IsDomainEx(inputValue))
{
//不存在返回,视为成功。
return true;
} //兼容 IP+空格+域名
string domain = inputValue;
if (!string.IsNullOrEmpty(inputValue) && inputValue.Trim().Contains(" "))
{
var hostLineArray = inputValue.Trim().Split(' ');
if (hostLineArray.Length > 1)
{
domain = hostLineArray[1];
}
} StringBuilder scHosts = new StringBuilder();
//修改
using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
using (StreamReader sr = new StreamReader(fs, Encoding.UTF8))
{
while (sr.Peek() >= 0)
{
string curLine = sr.ReadLine();
//只处理非#号开头的,微软的原注释保留
if (!string.IsNullOrEmpty(curLine) && !curLine.Trim().StartsWith("#"))
{
var hostLineArray = curLine.Trim().Split(' ');
if (hostLineArray.Length > 1)
{
string lineDomain = hostLineArray[1];
if (!string.IsNullOrEmpty(lineDomain) && lineDomain.Trim() == domain)
{
//如果是要删除的那行,直接跳过
continue;
}
}
} scHosts.AppendLine(curLine);
}
}
} //使hosts文件可写
FileInfo ff = new FileInfo(fileName);
if (ff.Attributes != FileAttributes.Normal)
{
File.SetAttributes(fileName, FileAttributes.Normal);
} string hostsContent = scHosts.ToString();
//写
using (FileStream fs = new FileStream(fileName, FileMode.Truncate, FileAccess.Write))
{
using (StreamWriter sr = new StreamWriter(fs, Encoding.UTF8))
{
sr.Write(hostsContent);
}
}
return true;
} /// <summary>
/// 添加或修改域名绑定
/// </summary>
/// <param name="hostsLineValue">格式:192.168.0.33 api.yun.comn</param>
/// <returns></returns>
public static bool AddOrEdit(string inputValue)
{
inputValue = inputValue.Trim();//去除前后空格 if (!inputValue.Trim().Contains(" "))
{
throw new Exception("非法域名绑定!");
} string fileName = GetHostFileFullName(); if (IsDomainEx(inputValue))
{
//存在则先删除旧的。新旧要绑定的IP可能会不一样。
Del(inputValue);
} //使hosts文件可写
FileInfo ff = new FileInfo(fileName);
if (ff.Attributes != FileAttributes.Normal)
{
File.SetAttributes(fileName, FileAttributes.Normal);
} bool writeEmptyLine = false;
string orgCon = GetHostsContent();
if (!orgCon.EndsWith("\r\n"))
{
writeEmptyLine = true;
} //修改
using (FileStream fs = new FileStream(fileName, FileMode.Append, FileAccess.Write))
{
using (StreamWriter sr = new StreamWriter(fs, Encoding.UTF8))
{
if (writeEmptyLine)
{
//非换行结尾的,添加上换行。
//避免出现 “192.168.0.7 cn.bing.co5192.168.0.8 cn.bing.co6”
sr.Write("\r\n");
}
sr.WriteLine(inputValue);
}
} return true;
} public static string GetHostsContent()
{
string con = string.Empty;
string fileName = GetHostFileFullName();
if (!File.Exists(fileName))
{
return con;
} using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
using (StreamReader sr = new StreamReader(fs, Encoding.UTF8))
{
con = sr.ReadToEnd();
}
} return con;
} }
}

使用:

添加或编辑:

HostsUtil.AddOrEdit("192.168.3.33 www.api.com");

删除:

HostsUtil.Del("www.api.com");

注意:WINFORM要有请求管理员权限。

C# .NET 操作Windows hosts的更多相关文章

  1. winreg操作windows注册表详解示例

    #coding:utf-8 #=====================================================================#=====本程序演示了WINR ...

  2. C语言操作WINDOWS系统存储区数字证书相关函数详解及实例

     C语言操作WINDOWS系统存储区数字证书相关函数详解及实例 以下代码使用C++实现遍历存储区证书及使用UI选择一个证书 --使用CertOpenSystemStore打开证书存储区. --在循环中 ...

  3. C# 操作windows服务[启动、停止、卸载、安装]

    主要宗旨:不已命令形式操作windows服务 static void Main(string[] args) { var path = @"E:\开发辅助项目\WCF\WCF.Test\WC ...

  4. 全键盘操作Windows

    计算机机用户在使用计算机的时候,是用键盘多一点?还是用鼠标多一点?如果是专业打字员,应该会说他使用键盘多一点,除此之外,多数人都会告诉你,他已经离不开鼠标了,没有鼠标,就不会操作电脑.   如果某一天 ...

  5. C#通过SC命令和静态公共类来操作Windows服务

    调用的Windows服务应用程序网址:http://www.cnblogs.com/pingming/p/5115304.html 一.引用 二.公共静态类:可以单独放到类库里 using Syste ...

  6. cmd命令行和bat批处理操作windows服务(转载)

    一.cmd命令行---进行Windows服务操作 1.安装服务 sc create 服务名 binPath= "C:\Users\Administrator\Desktop\win32srv ...

  7. (转)Python 操作 Windows 粘贴板

    转自: http://outofmemory.cn/code-snippet/3939/Python-operation-Windows-niantie-board Python 操作 Windows ...

  8. C#使用DirectoryEntry类操作Windows帐户

    1.创建windows帐户 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 /// <summary> /// 创建Windows帐户 /// </summa ...

  9. [经验分享]C# 操作Windows系统计划任务

    背景:我做了一个事情是要自己提前创建好很多要定时执行的任务,在我不在的时候自动执行这些程序,以保证我的工作能无人值守,那么我就需要建立系统计划任务来帮我完成这件事情,当然用脑子想想如何实现,很简单,每 ...

  10. C#.NET 操作Windows服务承载WCF

    Windows服务的制作.安装可以参考这篇: C#.NET 操作Windows服务(安装.卸载) - runliuv - 博客园 (cnblogs.com) 本篇会在这个解决方案基础上,继续修改. 一 ...

随机推荐

  1. 模拟IDC spark读写MaxCompute实践

    简介: 现有湖仓一体架构是以 MaxCompute 为中心读写 Hadoop 集群数据,有些线下 IDC 场景,客户不愿意对公网暴露集群内部信息,需要从 Hadoop 集群发起访问云上的数据.本文以 ...

  2. 基于 KubeVela 的机器学习实践

    ​简介:本文主要介绍如何使用 KubeVela 的 AI 插件,来帮助工程师更便捷地完成模型训练及模型服务. 作者:KubeVela 社区 在机器学习浪潮迸发的当下,AI 工程师除了需要训练.调试自己 ...

  3. [MySQL] 导入数据库和表的两种方式

    如果是导入 mysqldump 导出的 sql 文件,使用 mysql 命令再导入就可以了. 下面是另一种可选方式: use xxdb source /var/lib/mysql/xxtable.sq ...

  4. dotnet OpenXML 读取 PPT 形状边框定义在 Style 的颜色画刷

    本文来和大家聊聊在 PPT 形状使用了 Style 样式的颜色画刷读取方法 在开始之前,期望大家已了解如何在 dotnet 应用里面读取 PPT 文件,如果还不了解读取方法,请参阅 C# dotnet ...

  5. Vue源码-手写mustache源码

    引言 在Vue中使用模板语法能够非常方便的将数据绑定到视图中,使得在开发中可以更好的聚焦到业务逻辑的开发. mustache是一个很经典且优秀的模板引擎,vue中的模板引擎也对其有参考借鉴,了解它能更 ...

  6. 通过Google浏览器Cookie文件获取cookie信息,80以上版本有效

    public class ReadCookie { /// <summary> /// </summary> /// <param name="hostName ...

  7. ABAP 7.58 中支持任意精度算术的新类

    1. 引言 通常,有两种对编程语言的改进.第一种是让困难的事情变得简单,第二种是让不可能的事情变为可能.本文介绍的是任意精度算术,它属于第二类:使在ABAP中原本不可能的事情成为可能. 过去已经可以在 ...

  8. join分析:shuffle hash join、broadcast hash join

    Join 背景介绍 Join 是数据库查询永远绕不开的话题,传统查询 SQL 技术总体可以分为简单操作(过滤操作.排序操作 等),聚合操作-groupby 以及 Join 操作等.其中 Join 操作 ...

  9. docker-compose 配置LNMP环境

    仓库地址: https://gitee.com/haima1004/docker-lnmp 参考文档: 视频地址: https://www.bilibili.com/video/BV1S54y1B7K ...

  10. Oracle删除列操作:逻辑删除和物理删除

    概念 逻辑删除:逻辑删除并不是真正的删除,而是将表中列所对应的状态字段(status)做修改操作,实际上并未删除目标列数据或恢复这些列占用的磁盘空间.比如0是未删除,1是删除.在逻辑上数据是被删除了, ...