2009-05-21 21 views
7

Tôi đã tạo thành phần com trong C#, mà tôi đã đăng ký bằng cách sử dụng Regasm. Bây giờ tôi có thể sử dụng điều này trong IE bằng cách sử dụng ActiveXObject (...). Tuy nhiên điều này chỉ hoạt động khi tôi thay đổi cài đặt bảo mật IE của mình và cho phép chạy các điều khiển activex chưa được ký, trong trường hợp này tôi nhận được thông báo:Điều khiển activex trên trang này có thể không an toàn

Điều khiển ActiveX trên trang này có thể không an toàn để tương tác với các phần khác của trang . Bạn có muốn cho phép tương tác này không?

Tôi luôn muốn IE cho phép tương tác này mà không có lời nhắc. Có ai biết làm thế nào điều này có thể được thực hiện?

Cảm ơn

Trả lời

5

Điều khiển ActiveX của bạn phải triển khai giao diện IObjectSafety để IE ngừng hiển thị "không an toàn?" lời nhắc. Tôi đã làm điều này vài năm trước đây cho một điều khiển ActiveX VB6. Trong bước thứ 5 của This page được hiển thị cách thực hiện trong .Net.

+0

Điều đó đã hiệu quả! Cảm ơn David. – vikasde

+0

Điều này có được áp dụng cho biểu mẫu web hoặc biểu mẫu giành chiến thắng không? IObjectSafety có thể được triển khai mà không có trang ActiveX không? – clerktech

+0

Tôi sẽ giả sử "không". Tôi chỉ thấy nó với các điều khiển ActiveX. – David

0

Tôi nghĩ bạn chỉ có thể đặt mức độ tin cậy của trang web thành đầy đủ.

Tools-> Internet Options-> đến an ninh> Trusted Sites> nút

+1

Tôi đã đã thêm trang web vào danh sách đáng tin cậy của tôi. Tôi vẫn nhận được lời nhắc. – vikasde

0

Đối với ký ActiveX thấy this article Sites. Tuy nhiên bạn vẫn sẽ phải cho phép ActiveX (nó sẽ chỉ cho bạn thấy là tác giả). Xem câu trả lời của Ryan về cách cho phép ActiveX cho trang web này.

+0

Tôi không ngại cho phép điều khiển activex, tuy nhiên nếu tôi tiếp tục nhận được lời nhắc thì sẽ trở nên khó chịu. Điều khiển sẽ chỉ được sử dụng trên mạng nội bộ của chúng tôi. Tôi sẽ thấy nếu ký giúp. – vikasde

3

tôi đã phải đối mặt với problem.After này đi bộ dài tôi đã giải quyết problem.In lớp activeX bạn này chỉ đơn giản là kế thừa IObjectSafety class.See hình ảnh dưới đây: enter image description here

IObjectSafety lớp cho dưới đây:

[ComImport, GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")] 
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] 
public interface IObjectSafety 
{ 
    [PreserveSig] 
    int GetInterfaceSafetyOptions(ref Guid riid,[MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions,[MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions); 

    [PreserveSig()] 
    int SetInterfaceSafetyOptions(ref Guid riid,[MarshalAs(UnmanagedType.U4)] int dwOptionSetMask,[MarshalAs(UnmanagedType.U4)] int dwEnabledOptions); 
} 
public class IObjectSafetyImpl : IObjectSafety 
{ 
    private const string _IID_IDispatch = "{00020400-0000-0000-C000-000000000046}"; 
    private const string _IID_IDispatchEx = "{a6ef9860-c720-11d0-9337-00a0c90dcaa9}"; 
    private const string _IID_IPersistStorage = "{0000010A-0000-0000-C000-000000000046}"; 
    private const string _IID_IPersistStream = "{00000109-0000-0000-C000-000000000046}"; 
    private const string _IID_IPersistPropertyBag = "{37D84F60-42CB-11CE-8135-00AA004BB851}"; 

    private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001; 
    private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002; 
    private const int _OK = 0; 
    private const int _FAIL = unchecked((int)0x80004005); 
    private const int _NOINTERFACE = unchecked((int)0x80004002); 

    private bool _fSafeForScripting = true; 
    private bool _fSafeForInitializing = true; 

    public int GetInterfaceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pdwEnabledOptions) 
    { 
     int Result = _FAIL; 

     string strGUID = riid.ToString("B"); 
     pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA; 
     switch (strGUID) 
     { 
      case _IID_IDispatch: 
      case _IID_IDispatchEx: 
       Result = _OK; 
       pdwEnabledOptions = 0; 
       if (_fSafeForScripting == true) 
        pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER; 
       break; 
      case _IID_IPersistStorage: 
      case _IID_IPersistStream: 
      case _IID_IPersistPropertyBag: 
       Result = _OK; 
       pdwEnabledOptions = 0; 
       if (_fSafeForInitializing == true) 
        pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA; 
       break; 
      default: 
       Result = _NOINTERFACE; 
       break; 
     } 

     return Result; 
    } 

    public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions) 
    { 
     int Result = _FAIL; 

     string strGUID = riid.ToString("B"); 
     switch (strGUID) 
     { 
      case _IID_IDispatch: 
      case _IID_IDispatchEx: 
       if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_CALLER) && 
         (_fSafeForScripting == true)) 
        Result = _OK; 
       break; 
      case _IID_IPersistStorage: 
      case _IID_IPersistStream: 
      case _IID_IPersistPropertyBag: 
       if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_DATA) && 
         (_fSafeForInitializing == true)) 
        Result = _OK; 
       break; 
      default: 
       Result = _NOINTERFACE; 
       break; 
     } 

     return Result; 
    } 
} 
1
  1. Start -> Run -> regedit
  2. đến HKEY_CURRENT_USER \ Software \ Mi crosoft \ Windows \ CurrentVer sion \ Internet Settings \ Zones \ 0
  3. Doubleclick 1201 và thay đổi giá trị 0 (đó là lẽ 1)
  4. Đóng Registry Editor
+0

Điều này có thể được chạy trong một kịch bản? – clerktech

2

Bạn có thể tạo một tệp .reg để sửa đổi các khóa registry như thế này:

Windows registry Editor Version 5.00

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ Cừ rrentVersion \ Internet Settings \ Zones \ 0] "1201" = dword: 00000000
[HKEY_CURRENT_USER \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Internet Settings \ Zones \ 0] "1201" = dword: 00000000

Các vấn đề liên quan