9

C++/C/C#程序中的程序如何更改C:\Windows\System32\drivers\etc\hostsWindows中的文件内容?我知道这听起来像网络钓鱼,老实说不是。

4

6 回答 6

15

Hosts 文件的格式非常简单,其中每一行都可能包含“ip host”记录

您所需要的只是常规文件附加:

using (StreamWriter w = File.AppendText(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "drivers/etc/hosts")))
{
    w.WriteLine("123.123.123.123 FQDN");
}

请注意,默认情况下,您需要提升权限才能写入主机文件...

为了恢复,最好备份文件并在完成后恢复。

于 2011-06-29T21:12:42.910 回答
14

首先,您应该请求用户的管理权限。您可以通过应用程序中的 Program 类来执行此操作。下面的代码将请求用户进行管理访问,然后用户可以选择允许或拒绝它。如果他们拒绝,则此示例不会运行该应用程序。

一旦你的应用程序在管理模式下运行,它的纯文本格式就会很简单。您甚至不需要文件中包含的所有 Microsoft 注释,简单的字符串解析就可以了。就 HOSTS 文件本身而言,MSFT 在 HOSTS 文件中的注释是您真正需要的所有文档。

namespace Setup {
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
    using Setup.Forms;
    using System.Security.Principal;
    using System.Diagnostics;

    static class Program {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main() {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            WindowsPrincipal principal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
            bool administrativeMode = principal.IsInRole(WindowsBuiltInRole.Administrator);

            if (!administrativeMode) {
                ProcessStartInfo startInfo = new ProcessStartInfo();
                startInfo.Verb = "runas";
                startInfo.FileName = Application.ExecutablePath;
                try {
                    Process.Start(startInfo);
                }
                catch {
                    return;
                }
                return;
            }

            Application.Run(new ShellForm());
        }
    }
}
于 2011-06-29T21:29:23.107 回答
9

该文件通常位于C:\Windows\System32\drivers\etc\hosts. C:\Windows但是,您应该使用它Environment.GetEnvironmentVariable("SystemRoot")来安全地确定系统根目录,而不是对该部分进行硬编码。

否则,假设您具有适当的权限,您可以像任何其他文件一样写入它。

于 2011-06-29T21:10:34.070 回答
4

主机文件只是纯文本。格式是每行包含 IP 和 IP 应该解析到的主机名,用空格分隔。#表示评论。

例子:

# This is a comment-
127.0.0.1    mysuperhost.com

该文件位于此处:C:\Windows\system32\drivers\etc\hosts. 您将(有充分理由)需要管理员权限才能对其进行写入。

于 2011-06-29T21:07:39.837 回答
3

查找 HOSTS 文件位置的最准确方法是读取HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DataBasePath注册表项并附hosts加到末尾。

这将始终指向当前机器配置的正确位置,并且适用于自 Windows NT 4.0 以来的所有基于 Windows NT 的平台。

于 2013-06-20T08:52:43.797 回答
2

作为一个在这个问题上苦苦挣扎的人,简单的出路,将主机文件复制到临时文件夹,修改它并用覆盖将其复制回来。以管理员身份运行应用程序将是最好的。

于 2015-08-12T08:41:30.053 回答