如何在ASP.NET / C#中获取客户端计算机名?

我有应用程序想要获取用户机器名称,在这里我可以检索,它在localhost中工作正常。

string clientPCName; string[] computer_name = System.Net.Dns.GetHostEntry( Request.ServerVariables["remote_host"]).HostName.Split(new Char[] { '.' }); clientPCName = computer_name[0].ToString(); 

在本地,它返回我的计算机名称。
但在服务器上我得到的结果如下: 0x57364794
有解决方案吗

试试这个对我有用

 string clientMachineName; clientMachineName = (Dns.GetHostEntry(Request.ServerVariables["remote_addr"]).HostName); Response.Write(clientMachineName); 

机器名称仅是本地网络的概念,而本地AD网络/森林则是此概念。 一旦您在互联网上公开您的网站机器名称不再有意义,而是获得DNS名称。

因此,例如,在我的工作网络上,我的笔记本电脑名称解析为bdorrans01.redmond.contoso.com。 但是如果我从家里浏览一个网站,我当前的IP地址解析为c-98-203-143-14.hsd1.wa.comcast.net。

您正在使用FQDN并在第一段/完全停止后丢弃所有内容。 这适用于AD环境(有点),你的代码会在内部看到bdorrans01,但它会在外部看到c-98-203-143-14。

即使在多森林AD内部,如果您的网站托管在另一个森林中也是错误的,例如,如果您的网站位于example.europe.contoso.com上,您的代码将获得机器名称bdorrans01,但是我的机器不会在同一个林中,如果你试图ping它,或者映射到网络驱动器就不会找到它,因为你会在europe.contoso.com中寻找bdorrans01,而不是redmond.contoso。 com实际上是哪里。

此外,您的代码假定解析IP地址将产生完全限定的域名,在很多情况下不是这样,您可能只是获得一个IP地址,因此您可能会看到1.2.3.4并且您的代码将给出一个机器名称1.更糟糕的是它对IPv6地址没有任何作用,因为它们使用冒号分隔,2001:db8:85a3:8d3:1319:8a2e:370:7348

所以你的前提是不正确的 – 你需要找到一种不同的方式去做你想做的事情。 为什么你认为你还需要机器名?

正如@blowdark所写,实际上不可能获得客户端机器名称,主机名不是客户端机器名。 让我们来看看您的要求是什么?

  • 请求IP地址(TCP / IP)
  • HTTP标头

就这样。 IP地址是由Internet提供商提供的IP,主机名是Internet流量通过的某些提供商计算机的名称。 您甚至无法以简单的方式获取Internet提供商网络中的用户计算机本地IP地址。

如果您的应用程序具有负载均衡器或代理,则需要读取HTTP_X_FORWARDED_FOR标头(默认情况下)以获取请求客户端IP。 但它再次提供IP。

因此,从请求IP,您通常无法获得真正的客户端计算机名称。 在HTTP头文件中,浏览器也不传递机器名称。 也许有某种黑客你可以得到机器名称询问提供商服务器,但这超出了范围。

一旦启用浏览器以允许创建active-x对象,对于IE,您可以在javascript代码下面编写以获取客户端计算机名称:

 var WinNetwork = new ActiveXObject("WScript.Network"); var ComputerName = WinNetwork.ComputerName;