【问题标题】:How to get the computer name (hostname in a web aplication)?如何获取计算机名称(Web 应用程序中的主机名)?
【发布时间】:2010-05-17 16:02:25
【问题描述】:

如何在 Web 应用程序中获取客户端的计算机名称。网络中的用户。

问候

// 已经尝试过这个选项

string IP = System.Web.HttpContext.Current.Request.UserHostAddress;
string compName = DetermineCompName(IP);

System.Net.IPHostEntry teste = System.Net.Dns.GetHostEntry(IP);
ssresult = IP + "   -   " + teste.HostName;

// TODO: Write implementation for action

private static string DetermineCompName(string IP)
{
   IPAddress myIP = IPAddress.Parse(IP);
   IPHostEntry GetIPHost = Dns.GetHostEntry(myIP);
   string[] compName = GetIPHost.HostName.ToString().Split('.');
   return compName[0];
}

所有这些,只给我IP:/

【问题讨论】:

    标签: c#


    【解决方案1】:

    您不能以保证有效的方式执行此操作。

    您最接近的方法是使用您已经尝试过的System.Net.Dns.GetHostEntry 进行反向 dns 查找。

    问题是您的机器无法仅通过其 IP 地址知道远程 Web 客户端的主机名(除非它位于同一子网上,在这种情况下您可以检索它)。

    您必须依靠您的 DNS 基础架构,以便能够将 IP 映射回主机名 [这是 nslookup 在您输入主机名时所做的事情],而且很多地方都不会费心设置反向 IP 记录.

    另外,如果他们这样做,他们通常不会匹配主机名。看到“1.2.3.4”的反向查找返回为“machine-1.2.3.4”行而不是实际主机名是很常见的。

    如果客户端支持任何类型的网络地址转换,则此问题会进一步加剧,因此从外部角度来看,许多客户端计算机都有一个 IP。您可能不是这种情况,因为您声明了“网络中的用户”。

    顺便说一句,如果你去服务器并在命令提示符下输入,

    nslookup <some ip>
    

    (这些客户端机器之一的示例在哪里),你得到主机名了吗?

    如果你这样做了,那么System.Net.Dns.GetHostEntry 应该也可以,如果不是,那么由于上述原因它可能不能。

    【讨论】:

      【解决方案2】:

      您可以使用 - System.Environment.MachineName 获取 Windows 机器名称

      【讨论】:

      • 给出服务器名称,我想要客户端名称
      • 抱歉误读了您的问题。您可以使用此处描述的 win api - codeproject.com/KB/IP/ListNetworkComputers.aspx 我知道这不是一个很好的选择,因为它需要您缓存网络中所有机器的列表。
      • 只是进一步查看,您可以使用 System.Diagnostics.Process process = new System.Diagnostics.Process() 运行 nslookup; System.Diagnostics.ProcessStartInfo sInfo = new System.Diagnostics.ProcessStartInfo("nslookup.exe");结果 = process.StandardOutput.ReadToEnd();
      【解决方案3】:

      假设您的客户端是基于 Windows 运行的 IE,您可以使用此客户端代码来获取名称并将它们传递回服务器:

      <script type="text/javascript"> 
              function create() 
              { 
                 var net = new ActiveXObject("wscript.network"); 
                 document.write(net.ComputerName); 
              } 
      </script> 
      

      【讨论】:

        【解决方案4】:

        是的,需要您不断请求和缓存计算机,效率极低,这是个坏主意。

        我会在后台运行 nslookup 我没有测试过这段代码,也没有处理失败的错误,但基本上,你可以这样做:

        System.Diagnostics.Process process = new System.Diagnostics.Process(); 
        System.Diagnostics.ProcessStartInfo sInfo = new System.Diagnostics.ProcessStartInfo("nslookup.exe", "192.168.1.100");
        string result = process.StandardOutput.ReadToEnd(); 
        

        然后只解析结果值。

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多