现在的位置: 首页 > 综合 > 正文

实现获取客户端的MAC地址(3)

2012年09月17日 ⁄ 综合 ⁄ 共 5077字 ⁄ 字号 评论关闭

第四种方案:用脚本实现,编写一个脚本,让用户下载,下载后双击就获取MAC,然后通过XMLHTTP方式传给服务器,有可能,但后面一种方法实现后就没去试这个方案了

第五种方案:自己建立一个安全的ActiveX控件,这是终极方案
先参考以下两个文章:

http://support.microsoft.com/kb/182598/zh-cn

http://www.cnblogs.com/babyt/archive/2005/03/14/118264.html

在VB中建立ActiveX控件,然后实现IObjectSafety接口,生成OCX后,再用signcode.exe对其进行数字签名,签名用的文件又来自http://www.ca365.com/。最后放在网页上,让用户自动下载安装。
测试成功后,开始试验:

1、不实现IObjectSafety接口会如何?
在本机上都是小红叉,其它电脑就不试了

2、最小化实现IObjectSafety接口
要引用VB IObjectSafety Interface(文件objsafe.tlb)
Implements IObjectSafety
Private Sub IObjectSafety_GetInterfaceSafetyOptions( _
            ByVal riid As Long, pdwSupportedOptions As Long, pdwEnabledOptions As Long)
End Sub
Private Sub IObjectSafety_SetInterfaceSafetyOptions( _
            ByVal riid As Long, ByVal dwOptionsSetMask As Long, ByVal dwEnabledOptions As Long)
End Sub
而模块文件中的常量、API、Main子程序都可以不要

3、要不要经过打包这一步骤
不要了,因为我的控件没用到什么特别的DLL,在网页中直接这样写
<object classid="CLSID:...." CODEBASE="IobjSafety.ocx#version=1,0,0,6">
而不像打包文件写的那样:
<object classid="CLSID:...." CODEBASE="IobjSafety.CAB#version=1,0,0,6">

4、要用MKTYPLIB.EXE吗?
不用也一样正常
不过后来才知道,之前我们有的是objsafe.odl文本文件,经过
MKTYPLIB objsafe.odl / tlb objsafe.tlb
才得到tlb文件,这个tlb文件可以用于任何制作安全接口的控件。所以现在不用也正常。

5、要用LPK_TOOL.EXE吗?
不用。可能控件工程属性中标为“要求许可证关键字”时才用。

6、生成控件的CLSID如何找
一种方法,运行注册表,在HKEY_CLASSES_ROOT中找到“控件名.UserControl1”,其下的CLSID即是。
还有一种方法,在VB下启动自己的控件,会出来一个网页,然后再看其中的源代码,就可以找到控件的CLSID
如果建立VB的EXE,把控件拉出来,VBP文件中体现的不是CLSID,而是TypeLib。

7、不进行数字签名如何?
那就是经典的“Windows 已经阻止此软件因为无法验证发行者。”
现在我知道了IE的安全设置是有两个问题:
一是“对没有标记为安全的 ActiveX 控件进行初始化和脚本运行”的禁用,例如:Wscript.Shell、Scripting.FileSystemObject、76A64158-CB41-11D1-8B02-00600806D9B6、75718C9A-F029-11d1-A1AC-00C04FB6C223这些都是不引入安全接口的程序。我们普通的控件也就是吃这个亏。
二是对“下载未签名的 ActiveX 控件”的禁用。这就是我的控件即使按着安全接口在走,也被IE阻止的原因。

8、如何数字签名
用signcode.exe对ocx文件进行处理,其中要用到证书,所以要先去http://www.ca365.com/申请一个来,安装好根证书,再安装好个人证书,按着“阿泰”教的对ocx进行处理,再用chktrust.exe来验证。并且看一下ocx的右键,属性中是否多了一个“数字签名”。

9、申请证书
可以向http://www.ca365.com/申请证书,至于要什么类型的证书,只要前后都一贯性就行,没有什么大问题。我申请测试的证书Test,这样根证书也要下载Test的,将来自动注册的代码也要用Test的。

10、证书能一直用吗?
可以,我就申请一个,用在好几个控件上。

11、本机不安装根证书行吗
不行,那样,你申请的个人证书安装不了。个人证书安装不了,signcode.exe就不能继续。

控件安全接口也实现了,数字签名也签了,发布到网络上,就没问题了。

No! No! No!
客户端还要安装根证书

否则,IE还是一样弹出“经典”的对话框,不过其中的发行者变成链接,可以点击进去看,结果就是根证书不是受信任的

客户端安装根证书,一种方法是把rootTest.cer在各个客户端上安装,如果能这样,还不如把我的控件在客户端一个个地安装。另一种是http://www.ca365.com/提供的自动安装根证书的代码,我是用第二种,因为第一种在我试的一两台电脑上不行。另外我把它转为javascript的代码:
<OBJECT classid=clsid:127698e4-e730-4e5c-a2b1-21490a70c8a1 codebase="xenrlinf.cab#Version=5,131,3659,0" id=XEnroll name=XEnroll VIEWASTEXT></OBJECT><OBJECT id="oCAPICOM" codeBase="capicom.cab#version=2,0,0,3" classid="clsid:A996E48C-D3DC-4244-89F7-AFA33EC60679" VIEWASTEXT></OBJECT>
<script language="javascript" type="text/javascript">

installTestRoot();

function installTestRoot()
{
 var sPKCS7 = "";
 var n;

 sPKCS7 = "-----BEGIN CERTIFICATE-----\r\n" +
          "MIIDszCCApugAwIBAgIIPn9KwWPUprMwDQYJKoZIhvcNAQEFBQAwZzELMAkGA1UE\r\n" +
          "BhMCQ04xEDAOBgNVBAgTB0JlaWppbmcxEDAOBgNVBAcTB0JlaWppbmcxDjAMBgNV\r\n" +
          "BAoTBUNBMzY1MSQwIgYDVQQDExtDQTM2NSBUZXN0IFJvb3QgQ2VydGlmaWNhdGUw\r\n" +
          "HhcNMDEwNTEyMDg0MDIwWhcNMzEwNTA1MDg0MDIwWjBnMQswCQYDVQQGEwJDTjEQ\r\n" +
          "MA4GA1UECBMHQmVpamluZzEQMA4GA1UEBxMHQmVpamluZzEOMAwGA1UEChMFQ0Ez\r\n" +
          "NjUxJDAiBgNVBAMTG0NBMzY1IFRlc3QgUm9vdCBDZXJ0aWZpY2F0ZTCCASIwDQYJ\r\n" +
          "KoZIhvcNAQEBBQADggEPADCCAQoCggEBAL7TIQ00d7mYx9CNOvGJDCTm+yFK5rM3\r\n" +
          "tH3Om5e9eQtt290t3TJoMEm78SNi7rVl/tgPtR3IEznL8C9NREeyG48Mlh3RLkCH\r\n" +
          "9YVvwqoz5dPU8OSiV4KMwuaAk0NxEWal3jtDN2yNZiNrqjXeYWdkIvYE8jEYSXVD\r\n" +
          "GB748oBMhrXR8mN5QyYPJ/yuXTK4vkrgOdn+DA46NECpFNpj97AgdmsjU1oEx/WF\r\n" +
          "xSDrwQv5JwpVkNO4hlUqvU2HkSwJiYibWTHiuq/WX2KZRiGBbQsMUlBKT/SGTz0x\r\n" +
          "kTBciXzkTN4kd0nHcYcbhRyNCj3S9tLjZuU4KmO8aYq+3uw7MzuIqaUCAwEAAaNj\r\n" +
          "MGEwHQYDVR0OBBYEFOFerZs5arMIYGXkIn7sz8xPsdHLMA4GA1UdDwEB/wQEAwIB\r\n" +
          "BjAfBgNVHREEGDAWhhRodHRwOi8vd3d3LmNhMzY1LmNvbTAPBgNVHRMBAf8EBTAD\r\n" +
          "AQH/MA0GCSqGSIb3DQEBBQUAA4IBAQB5tTmySgq4J50bWoz+F7pZL75U0X4IPmQ+\r\n" +
          "wXaUr8M7PthCMMIv/CN9mLbWK8fEXO8cEMkpusgSbSZybJpNggeLuyu+9iZcJnsZ\r\n" +
          "TOXs7JnG0D91N0m/y/8Q794XsG64X2MRKBAMEyv/l0oR2fYym9iOkCJtv5rkMYWG\r\n" +
          "jYplLrJWsEooFOrn4CzWkJ3lYuuc+WdlXEsPfLedPB5xAl1PU8FSjxvwEczOdWWK\r\n" +
          "99YMbVaQDMPSeVLKwxWeLtcZ10leyCotGpPaLLwcUEWiTyVt0mPZ+NQEqpm3nApp\r\n" +
          "BeRFkRLtHm1+BF8piiZ/89ToczDZBx87TM2KqqUolQ4usKzB+P/r\r\n" +
          "-----END CERTIFICATE-----\r\n";

 if (haveInstalled("3964 D899 A04C 9EC7 BCF9 BB4E 6E60 226D CD6E 5BA0") == 0)
 {
  n = XEnroll.InstallPKCS7Ex(sPKCS7);
  if (n == 0)
   alert("没有安装测试根证书,请手动下载根证书,并安装!");
 }
}

function haveInstalled(str)
{
 var storeName;
 var thumbprint;
 var thumbprint0;
 var i;

 thumbprint0 = str;
 thumbprint0 = thumbprint0.replace(/ /g, "").toUpperCase();

 st = new ActiveXObject("CAPICOM.Store");
 
 //get store name
 storeName = "root";
 //open store
 st.Open(2, storeName, 0);  //这里每次都会提示一段英文,所以这种代码不能放在网页上直接执行,需要时用户再点某个链接过来

 for (i=1; i<st.Certificates.count; i++)
 {
  thumbprint = st.Certificates(i).thumbprint.replace(/ /g, "").toUpperCase();
  if (thumbprint == thumbprint0)
  {
   return 1;
  }
 }
 return 0;
}
</script>
就这样,我的控件在IE默认的安全设置下总算可以发布出去了。

其它一些知识点:如何删除证书,如何在客户端禁用/更新我的控件(在IE属性的“程序”页签的“管理加载项”,也可以通过“工具”菜单中进入),如何删除我的控件(在C:\WINDOWS\Downloaded Program Files,使用regsvr32 /u 控件名.ocx,再del)

抱歉!评论已关闭.