2009-05-21 8 views
7

Ho creato un componente com in C#, che ho registrato utilizzando Regasm. Ora sono in grado di utilizzare questo in IE utilizzando ActiveXObject (...). Tuttavia questo funziona solo quando cambio le mie impostazioni di sicurezza di IE e permettono di eseguire controlli ActiveX senza firma, nel qual caso ottengo il messaggio:Un controllo activex in questa pagina potrebbe essere pericoloso

controllo

ActiveX in questa pagina potrebbe essere pericoloso per interagire con altre parti della pagina . Vuoi consentire questa interazione?

Voglio sempre che IE consenta questa interazione senza il prompt. Qualcuno sa come si può fare?

Grazie

risposta

5

Il controllo ActiveX deve implementare l'interfaccia IObjectSafety affinché IE smetta di mostrare "non sicuro?" richiesta. L'ho fatto diversi anni fa per un controllo ActiveX VB6. Nel quinto passaggio di This page viene mostrato come farlo in .Net.

+0

Ha funzionato! Grazie mille David. – vikasde

+0

Questo viene applicato al modulo web o al modulo di vincita? È possibile implementare IObjectSafety senza la pagina ActiveX? – clerktech

+0

Assumerei "no". L'ho visto solo con i controlli ActiveX. – David

0

penso che si può solo impostare i siti fiducia livello fino alla piena.

Strumenti-> Opzioni Internet-> Protezione-> Trusted Siti-> pulsante

+1

ho già aggiunto il sito al mio elenco di fiducia. Ho ancora il prompt. – vikasde

0

Per quanto riguarda la firma della ActiveX vedere this article Siti. Tuttavia dovrai comunque consentire l'ActiveX (ti mostrerà solo come autore). Vedi la risposta di Ryan su come abilitare l'ActiveX per questo sito.

+0

Non mi interessa consentire il controllo activex, tuttavia se continuo a ricevere il prompt, diventerà fastidioso. Il controllo verrà comunque utilizzato solo sulla nostra intranet. Vedrò se la firma aiuta. – vikasde

3

ho già affrontato questa passeggiata lungo problem.After ho risolto questo problem.In classe ActiveX semplicemente ereditare IObjectSafety class.See l'immagine sotto: enter image description here

IObjectSafety Classe dato sotto:

[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 -> Esegui -> regedit
  2. Vai HKEY_CURRENT_USER \ Software \ Mi utilizzando MS \ Windows \ CurrentVersion sione \ Internet Settings \ Zones \ 0
  3. Doubleclick 1201 e cambiare il valore a 0 (era probabilmente 1)
  4. Chiudere Editor del Registro
+0

Può essere eseguito in uno script? – clerktech

2

È possibile creare un file .reg per modificare la chiave di registro in questo modo: Versione

Windows Registry Editor 5.00

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

Problemi correlati