目前为止,我尚没有碰到过类似的应用,或者说在需要实现类似功能的时候,我总是首先会想到如何利用客户端的IP地址来解决问题.
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)不过今天有一个客户问了这个问题,原因是在做内网测试的时候,需要通过客户端的机器名来验证某些信息.
着手这一个案例并做了一些简单的测试之后,我发现,以下一些在网络上常见的用来获得客户端计算机名的代码被证明是错误的:
1protected void Page_Load(object sender, EventArgs e)
2{
3 //获得服务器端的机器名
4 Response.Write("System.Net.Dns.GetHostName(): ");
5 Response.Write("b" + System.Net.Dns.GetHostName() + "/bbr /");
6
7 //获得服务器端的机器名
8 Response.Write("System.Environment.MachineName: ");
9 Response.Write("b" + System.Environment.MachineName + "/bbr /");
10
11 //在Visual Studio下运行获得当前登陆用户
12 //在IIS下运行,获得的值为空
13 Response.Write("Page.User.Identity.Name: ");
14 Response.Write("b" + Page.User.Identity.Name + "/bbr /");
15
16 //获得客户端的IP地址
17 Response.Write("Page.Request.UserHostName: ");
18 Response.Write("b" + Page.Request.UserHostName + "/bbr /");
19}
似乎是基于某些安全的因素,Framwork并没有给出可以获得客户端机器信息的类及方法.如果这是真的,那么我们便只能通过客户端的JavaScript代码以及ActiveX控件来实现这一功能了.在努力搜寻了一段时间之后,我找到了如下的解决方案:
1html
2head
3 titleWMI Scripting HTML/title
4 script FOR="foo" EVENT="OnCompleted(hResult,pErrorObject, pAsyncContext)" LANGUAGE="JScript"
5 document.forms[0].txtMACAddr.value=unescape(MACAddr);
6 document.forms[0].txtIPAddr.value=unescape(IPAddr);
7 document.forms[0].txtDNSName.value=unescape(sDNSName);
8 /script
9
10 script FOR="foo" EVENT="OnObjectReady(objObject,objAsyncContext)" LANGUAGE="JScript"
11 if(objObject.IPEnabled != null && objObject.IPEnabled != "undefined" && objObject.IPEnabled == true)
12 {
13 if(objObject.MACAddress != null && objObject.MACAddress != "undefined")
14 MACAddr = objObject.MACAddress;
15
16 if(objObject.IPEnabled && objObject.IPAddress(0) != null && objObject.IPAddress(0) != "undefined")
17 IPAddr = objObject.IPAddress(0);
18
19 if(objObject.DNSHostName != null && objObject.DNSHostName != "undefined")
20 sDNSName = objObject.DNSHostName;
21 }
22 /script
23
24/head
25body
26 object classid="CLSID:76A64158-CB41-11D1-8B02-00600806D9B6" id="locator" VIEWASTEXT/object
27 object classid="CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223" id="foo"/object
28
29 script LANGUAGE="JScript"
30 var service = locator.ConnectServer();
31 var MACAddr ;
32 var IPAddr ;
33 var DomainAddr;
34 var sDNSName;
35 service.Security_.ImpersonationLevel=3;
36 service.InstancesOfAsync(foo, 'Win32_NetworkAdapterConfiguration');
37 /script
38
39 form method="POST" action="NICPost.asp" id="formfoo" name="formbar"
40 input type="text" name="txtMACAddr"
41 input type="text" name="txtIPAddr"
42 input type="text" name="txtDNSName"
43 /form
44/body
45/html
46
测试后发现,这一解决方案不仅能够获得客户端的机器名,同时还给出了客户端机器的MAC地址,以及客户端机器所在的内网IP地址(比如192.168.0.100).只是在运行该页面的时候,浏览器会给出不安全ActiveX控件的提示,并允许客户端禁止ActiveX控件的运行,不过我相信,这已经可以满足大部分需要用到这一功能的情景了.