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


    第四种方案:用脚本实现,编写一个脚本,让用户下载,下载后双击就获取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)

  • 相关阅读:
    selenium(六)Page Object模式(使用selenium的PageFactory)
    CodeForces 1325C Ehab and Path-etic MEXs(思维)
    CodeForces 1325D Ehab the Xorcist(异或和+算数和)
    家庭房产(模拟)
    取硬币(思维)
    Xor and Sum(异或和+算术和)
    一元三次方程求解(数学、二分)
    最大最小公倍数 (数学、贪心)
    天梯---球队“食物链”(DFS+剪枝)
    HDU-4857 逃生(逆向拓扑排序)
  • 原文地址:https://www.cnblogs.com/yzx99/p/1385554.html
Copyright © 2020-2023  润新知