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

本文关键字:获取 客户端 计算机名 ASP NET | 更新日期: 2023-09-27 17:58:03

我有一个应用程序想要获取用户机器名称,在这里我可以检索,它在localhost中运行良好。

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

在本地,它会准确地返回我的计算机名
但在服务器上,我得到的结果是:0x57364794
有什么解决方案吗?

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

试试这个,它对我有效

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.com.cast.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 IP地址,因此您可能会看到1.2.3.4,并且您的代码将给出一个1的机器名。更糟糕的是,它不会对IPv6地址做任何事情,因为它们使用冒号来分隔,2001:db8:85a3:8d3:1319:8a2e:370:7348

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

正如@blowdak所写,实际上不可能获得客户端机器名,主机名不是客户端机器名。让我们看看您可以从请求中获得什么?

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

仅此而已。IP地址是由您的互联网提供商提供的IP,主机名是互联网流量通过的某个提供商机器的名称。您甚至无法通过简单的方式获得互联网提供商网络中的用户机器本地IP地址。

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

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

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

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