【问题标题】:How can I read the client's machine/computer name from the browser?如何从浏览器中读取客户端的机器/计算机名称?
【发布时间】:2010-10-29 16:17:15
【问题描述】:

如何从浏览器中读取客户端的机器/计算机名称?
是否可以使用 JavaScript 和/或 ASP.NET?

【问题讨论】:

  • 我不确定,但可能是 JS 安全策略不允许的
  • 好吧,您可以添加一个输入字段并要求用户输入他的计算机名称 ;-)
  • 原因是客户希望能够将计算机/机器名称附加到用户提交的工单上的 IT 支持系统
  • Ryan,这正是我制作的内部应用程序也需要它的确切原因。该应用程序必须将计算机名称附加到从特定机器生成的服务请求票证上。用户在填写工单时不必知道计算机名称。

标签: javascript asp.net computer-name


【解决方案1】:

有一些信息要解析到 webRTC 标头中。

var p = new window.RTCPeerConnection();
p.createDataChannel(null);
p.createOffer().then((d) => p.setLocalDescription(d))
p.onicecandidate = (e) => console.log(p.localDescription)

【讨论】:

    【解决方案2】:

    您可以使用 asp.net 获取 ip 地址,然后对 ip 进行反向 DNS 查找以获取主机名。

    来自 ASP.NET 开发人员的食谱...Performing a Reverse-DNS Lookup

    【讨论】:

    • 我用 192.168.1.100(机器托管浏览器的 IP 地址)运行该代码,它给出了错误:'错误:请求的名称有效,但未找到请求类型的数据'
    • 192.168.*.* 是私有 IP 地址,您需要在私有网络上的计算机上运行代码并在网络上拥有 DNS 服务器才能使其工作。
    • 在某些情况下这是不可能的,因为网络服务器可能位于高级代理/防火墙后面。那么你将得到的只是这个代理/防火墙的 IP 地址/主机名。这通常适用于大型网络农场。因此,请务必在实施之前检查最终的生产网络拓扑。
    • 提供的 url 已关闭,这就是不赞成仅使用 url 的答案的原因。链接可以更新吗?有人可以注入相关的代码并提供引用参考吗?
    • 反向 DNS 断开链接
    【解决方案3】:

    没有办法这样做,因为 JavaScript 无法访问计算机名称、文件系统和其他本地信息。安全是主要目的。

    【讨论】:

    • “这是 JavaScript 规范的一部分”——它不是。这些都是非常语言规范的一部分。当它们可用时,它是通过宿主环境提供的功能。浏览器不提供它们。 NodeJS 可以。 (举两个常见的例子)。
    • 感谢@Quentin,很好的纠正。出于安全原因,这是浏览器的限制。
    【解决方案4】:
    <html>
    <body onload = "load()">
    <script>
      function load(){ 
    
         try {
           var ax = new ActiveXObject("WScript.Network");
           alert('User: ' + ax.UserName );
           alert('Computer: ' + ax.ComputerName);
         }
         catch (e) {
           document.write('Permission to access computer name is denied' + '<br />');
         } 
      }
    </script>
    </body>
    </html>
    

    【讨论】:

      【解决方案5】:

      尝试使用下面给出的代码在 Mozilla Firefox 中获取客户端计算机名称。

      netscape.security.PrivilegeManager.enablePrivilege( 'UniversalXPConnect' ); 
      
      var dnsComp = Components.classes["@mozilla.org/network/dns-service;1"]; 
      var dnsSvc = dnsComp.getService(Components.interfaces.nsIDNSService);
      var compName = dnsSvc.myHostName;
      

      另外,同一段代码可以作为扩展,并且可以从您的网页中调用。

      请在下面找到示例代码。

      扩展代码:

      var myExtension = {
        myListener: function(evt) {
      
      //netscape.security.PrivilegeManager.enablePrivilege( 'UniversalXPConnect' ); 
      var dnsComp = Components.classes["@mozilla.org/network/dns-service;1"]; 
      var dnsSvc = dnsComp.getService(Components.interfaces.nsIDNSService);
      var compName = dnsSvc.myHostName;
      content.document.getElementById("compname").value = compName ;    
        }
      }
      document.addEventListener("MyExtensionEvent", function(e) { myExtension.myListener(e); }, false, true); //this event will raised from the webpage
      

      网页代码:

      <html>
      <body onload = "load()">
      <script>
      function showcomp()
      {
      alert("your computer name is " + document.getElementById("compname").value);
      }
      function load()
      { 
      //var element = document.createElement("MyExtensionDataElement");
      //element.setAttribute("attribute1", "foobar");
      //element.setAttribute("attribute2", "hello world");
      //document.documentElement.appendChild(element);
      var evt = document.createEvent("Events");
      evt.initEvent("MyExtensionEvent", true, false);
      //element.dispatchEvent(evt);
      document.getElementById("compname").dispatchEvent(evt); //this raises the MyExtensionEvent event , which assigns the client computer name to the hidden variable.
      }
      </script>
      <form name="login_form" id="login_form">
      <input type = "text" name = "txtname" id = "txtnamee" tabindex = "1"/>
      <input type="hidden" name="compname" value="" id = "compname" />
      <input type = "button" onclick = "showcomp()" tabindex = "2"/>
      
      </form>
      </body>
      </html>
      

      【讨论】:

      • 注意:这段代码已经很老了,不能在任何当前版本的 Firefox 中工作——甚至在扩展中也不行。
      【解决方案6】:

      来自 Kelsey 的更新版本:

      $(function GetInfo() {
          var network = new ActiveXObject('WScript.Network');
              alert('User ID : ' + network.UserName + '\nComputer Name : ' + network.ComputerName + '\nDomain Name : ' + network.UserDomain);
              document.getElementById('<%= currUserID.ClientID %>').value = network.UserName;
              document.getElementById('<%= currMachineName.ClientID %>').value = network.ComputerName;
              document.getElementById('<%= currMachineDOmain.ClientID %>').value = network.UserDomain;
      });
      

      要存储值,请添加以下控件:

      <asp:HiddenField ID="currUserID" runat="server" /> <asp:HiddenField ID="currMachineName" runat="server" /> <asp:HiddenField ID="currMachineDOmain" runat="server" />
      

      你也可以像这样从后面调用它:

      Page.ClientScript.RegisterStartupScript(this.GetType(), "MachineInfo", "GetInfo();", true);
      

      【讨论】:

      • 不好意思回复快了,你也可以用cookie来存值,试试看
      • ActiveXObject 无法在 Chrome 中工作。我尝试了一些使用 ActiveXObject 的示例。IE 代码执行但在 Chrome 中没有...
      【解决方案7】:

      “有时”您可以使用 IE 来完成此操作,因为我已针对仅 IE 的 Intranet 上的内部应用程序执行此操作。请尝试以下操作:

      function GetComputerName() {
          try {
              var network = new ActiveXObject('WScript.Network');
              // Show a pop up if it works
              alert(network.computerName);
          }
          catch (e) { }
      }
      

      它可能需要也可能不需要在 IE 中进行一些特定的安全设置设置,以允许浏览器访问 ActiveX 对象。

      这里是有关 WScript 的更多信息的链接:More Information

      【讨论】:

      • 仅适用于 Internet Explorer,不适用于 Microsoft Edge
      【解决方案8】:

      Erm 有什么理由不能只使用 HttpRequest 吗?这将在服务器端,但如果需要,您可以将其传递给 javascript?

      Page.Request.UserHostName
      

      HttpRequest.UserHostName

      这样做的一个问题是它只能在 Intranet 环境中真正工作,否则它最终只会获取用户的路由器或代理地址......

      【讨论】:

        【解决方案9】:

        浏览器、操作系统、屏幕颜色、屏幕分辨率、Flash 版本和 Java 支持都应该可以从 JavaScript 中检测到(可能还有更多)。但是,计算机名是不可能的。

        编辑:至少不可能在所有浏览器中使用。

        【讨论】:

          【解决方案10】:

          不,此数据不公开。唯一可用的数据是通过 HTTP 请求公开的数据,其中可能包括其操作系统和其他此类信息。但肯定不是机器名。

          【讨论】:

            【解决方案11】:

            无法使用 Javascript 获取用户的计算机名称。您可以获得有关浏览器和网络的所有详细信息。但仅此而已。

            就像今天有人在上一个问题中回答的那样。

            我已经帮了你一个忙,可能我会返回或推荐其他朋友.. 我还告诉你我在哪里以及我使用的操作系统、浏览器和屏幕分辨率为什么你想知道颜色我的内衣? ;-)

            你也不能使用 asp.net 来做到这一点。

            【讨论】:

            • 嗯,如果您在企业环境中构建内部应用程序,您会惊讶于知道这些信息会有多大帮助。我们跟踪应用程序中的错误,用户使用的 IP 地址会根据他们的环境(wifi、LAN、VPN)而变化。能够从客户端发送到服务器的日志中获取他们的计算机名称,并使用企业工具查看该计算机上安装的软件和 Windows 补丁程序是可能的。无需直接访问计算机。无需让非技术员工参与进来,就可以极大地帮助排除故障。
            • @JohnathonSullinger 对于内部应用程序,您可以运行一个简单的本地主机网络服务器(作为 Windows 服务在后台运行),它返回有关用户计算机的信息,这些信息可以通过 AJAX/ 由网络应用程序查询fetch 请求 - 显然要确保它是安全的,并且只返回最少的非机密数据,但这是允许 Web 应用程序与用户的台式计算机集成的一种方式。这就是 Dell 的 Service-Tag finder 之类的工作方式(假设您安装了 Dell Support Assistant)。
            • @Dai 在我们企业的 7,000 多个客户端桌面上运行网络服务器并不是我们想要的。您必须修补和维护该网络服务器,然后处理不同类型的设备,例如 Chromebook、Macbook、Windows ARM 和 x86 设备等。整理和管理所有这些将是一场噩梦。
            • 我们正在做的是从机器中提取 IP 并从 HTTP 请求中记录该服务器端。 IP 地址往往会在我们的控制下发生变化,但每台设备每隔几周或几个月才会发生一次。对于支持,这通常不是问题。对于敏感的审计相关的事情,我们只是在我们的 AD 域控制器中对 IP 进行 DNS 查找,作为服务器端日志处理的一部分。然后我们编写日志条目。这是因为我们所有的设备前面都有与机器名称匹配的 DNS。
            猜你喜欢
            • 2014-07-16
            • 1970-01-01
            • 1970-01-01
            • 2012-12-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多