是否可以将ActiveX对象标记为安全,以便不需要更改IE设置?

时间:2014-01-15 11:29:05

标签: c# .net internet-explorer activex .net-assembly

我创建了一个启动应用程序的ActiveX dll程序集。我在浏览器中通过JavaScript调用了这个dll。该应用程序是通过点击URL启动的。

要使此脚本正常工作,我需要转到IE设置并启用“初始化并编写未标记为安全的activex控件脚本”。有没有办法编写ActiveX对象以将其标记为安全?

我使用SN工具生成密钥(.snk文件),使用此密钥编译DLL。所以dll已经签名但是它不会运行,除非我在IE设置中启用“初始化和脚本activex控件未标记为安全”。

这是我已经实施并希望将其标记为安全的文章: - Writing an ActiveX control in C#

我在<{strong> this microsoft link上引用了安全控制概念(IObjectSafety): -

我无法理解需要放置此代码的位置。任何帮助都会使它更清晰..

1 个答案:

答案 0 :(得分:1)

我从不同的地方收集了一些代码(和知识),这是我的工作版本 -界面

    [Serializable, ComVisible(true)]
    public enum ObjectSafetyOptions
    {
        INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001,
        INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002,
        INTERFACE_USES_DISPEX = 0x00000004,
        INTERFACE_USES_SECURITY_MANAGER = 0x00000008
    }

    //
    // MS IObjectSafety Interface definition
    //
    [
        ComImport(),
        Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064"),
        InterfaceType(ComInterfaceType.InterfaceIsIUnknown)
    ]
    public interface IObjectSafety
    {
        [PreserveSig]
        long GetInterfaceSafetyOptions(ref Guid iid, out int pdwSupportedOptions, out int pdwEnabledOptions);

        [PreserveSig]
        long SetInterfaceSafetyOptions(ref Guid iid, int dwOptionSetMask, int dwEnabledOptions);
    }
  • 和实施

        #region safe for scripting
        private ObjectSafetyOptions m_options = ObjectSafetyOptions.INTERFACESAFE_FOR_UNTRUSTED_CALLER | ObjectSafetyOptions.INTERFACESAFE_FOR_UNTRUSTED_DATA;
        public long GetInterfaceSafetyOptions(ref Guid iid, out int pdwSupportedOptions, out int pdwEnabledOptions)
        {
            pdwSupportedOptions = (int)m_options;
            pdwEnabledOptions = (int)m_options;
            return 0;
        }
    
        public long SetInterfaceSafetyOptions(ref Guid iid, int dwOptionSetMask, int dwEnabledOptions)
        {
            return 0;
        }
        #endregion safe for scripting
    

现在IE不再显示确认对话框。