不修改hosts文件进行主机名解析

7
我正在尝试找出一种方法,使主机名能够解析到特定的IP地址,但不需要修改DNS或主机文件。
使用C#,我正在从客户端向服务器发起请求,但必须在请求中使用主机名,以便证书能够正确验证请求。然而,我的程序旨在在没有管理员权限的情况下运行,因此我无法修改主机文件。我已经有了正确的IP地址和主机名,是否有其他方法可以让计算机将主机名解析为IP地址?

1
这台机器使用的DNS服务器出了什么问题,导致它无法自动将主机名解析为正确的IP地址? - cadrell0
服务器没有在DNS上注册,因此无法进行解析。 - Cannoliopsida
4个回答

2

看起来最简单的解决方法是创建一个有权修改主机文件的服务,然后从主程序调用该服务。 该服务运行一个单一的命令并退出。由于服务可以具有提升的权限,因此您可以在标准用户程序中封装管理员权限。


1

如果您正在进行HTTP请求,则无需解析主机名;在URL中使用IP地址,并在HTTP请求中传递主机标头。

HttpWebRequest.Host Property

更新:抱歉,没有看到证书要求。我认为您应该能够在安装过程中修改hosts文件(因为安装通常在管理员权限下进行)。将您感兴趣的主机名添加到指向127.0.0.1(本地计算机)的位置。然后,您的应用程序可以打开一个侦听套接字并充当代理,将数据引导到实际的Web服务器。这可能会受到客户端启用防火墙的影响,具体情况可能有所不同。


1
如果他这样做,SSL证书验证将失败,因为证书上的名称可能实际上有一个DNS名称,它将不匹配Host属性中使用的IP。这就是他试图避免的。 - CodingGorilla
我正在使用RasDial建立连接,因此看起来(我不是RAS专家),我可以提供一个IP或主机名作为“电话号码”。除非我将主机名用作电话号码,否则连接上的认证将无法工作。 - Cannoliopsida
在安装期间这样做是行不通的(如此直截了当),因为我必须在程序运行期间从外部源请求IP和主机名。那时我意识到了解决方案(我将其发布为答案);一旦我拥有了所有必要的信息,我就创建了第二个服务,并在那里进行管理工作(无论是在安装还是在运行中都可以,具体取决于它是否是网络服务或其他)。 - Cannoliopsida

-1
   public bool ModifyHostsFile(string sEntryIPAddr, string sEntryURL)
    {
        try
        {
            using (StreamWriter w = File.AppendText(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), @"drivers\etc\hosts")))
            {
                w.WriteLine(sEntryIPAddr+" "+ sEntryURL);
                return true;
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            return false;
        }
    }

请添加一些说明,解释这段代码为什么可以帮助楼主。这将有助于为未来的观众提供一个可以学习的答案。更多信息请参见[回答]。 - Heretic Monkey
1
OP不想修改hosts文件。 - Ray Henry

-5
这对我有用:
步骤1. 打开Windows开始菜单,搜索记事本应用程序,然后右键点击记事本图标。
步骤2. 选择“以管理员身份运行”,然后在记事本中浏览包含hosts文件的文件夹(/windows/system32/drivers/etc)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接