2010-10-10 1 views
1

J'ai lutté pendant des jours en essayant d'obtenir un simple ActiveX DLL pour travailler sans succès malgré l'étude de plusieurs articles sur le sujet que j'ai trouvé en ligne.Pourquoi l'erreur ActiveX "Unknown Publisher" lors de l'utilisation du certificat signé?

Je suppose que j'ai plusieurs erreurs de codage, car je ne suis pas familier avec cela et la plupart des articles sur le sujet sont périmés. J'utilise Visual Studio 2008 et j'ai utilisé le Windows SDK v7.1 pour la signature numérique. Ce que j'essaye de faire est de renvoyer le client machineName de la classe d'environnement à la page Web (et finalement au serveur Web).

Ceci est mon classe C#:

using System; 
using System.Reflection; 
using System.Runtime.InteropServices; 
using System.ComponentModel; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using Microsoft.Win32; 

namespace GetClientInfo101 
{ 
    [Guid("121C3E0E-DC6E-45dc-952B-A6617F0FAA32")] 
    [InterfaceType(ComInterfaceType.InterfaceIsDual)] 
    [ComVisible(true)] 
    public interface IGetClient 
    { 
     [DispId(1)] 
     string GetClient(); 
    } 
    [Guid("5085C918-0236-4828-BDFA-063FEE57C69B")] 
    [ProgId("getClientInfoAx.CGetClient")] 
    [ClassInterface(ClassInterfaceType.None)] 
    [ComDefaultInterface(typeof(IGetClient))] 
    [System.ComponentModel.ToolboxItem(true)] 
    [ComVisible(true)] 
    public class CGetClient : IGetClient 
    { 
     public string GetClient() 
     { 
      return Environment.MachineName; 
     } 
    } 
} 

Voici mon montage:

using System.Reflection; 
using System.Runtime.CompilerServices; 
using System.Runtime.InteropServices; 

// General Information about an assembly is controlled through the following 
// set of attributes. Change these attribute values to modify the information 
// associated with an assembly. 
[assembly: AssemblyTitle("GetClientInfo101")] 
[assembly: AssemblyDescription("")] 
[assembly: AssemblyConfiguration("")] 
[assembly: AssemblyCompany("")] 
[assembly: AssemblyProduct("GetClientInfo101")] 
[assembly: AssemblyCopyright("Copyright © N/A 2010")] 
[assembly: AssemblyTrademark("")] 
[assembly: AssemblyCulture("")] 

// Setting ComVisible to false makes the types in this assembly not visible 
// to COM components. If you need to access a type in this assembly from 
// COM, set the ComVisible attribute to true on that type. 
[assembly: ComVisible(false)] 

// The following GUID is for the ID of the typelib if this project is exposed to COM 
[assembly: Guid("1bf2a0bc-f9cb-4f68-8990-5caaf3ab525d")] 

// Version information for an assembly consists of the following four values: 
[assembly: AssemblyVersion("1.0.0.0")] 
[assembly: AssemblyFileVersion("1.0.0.0") 

Voici mon tag d'objet et script sur mon site Maître page. ** NOTE: Je reçois l'erreur

Microsoft JScript runtime error: Automation server can't create object

sur l'exécution "var" **:

<object id="getClientInfo" name="GetClientInfo101" classid="clsid:5085C918-0236-4828-BDFA-063FEE57C69B" 
     codebase="GetClientInfo/GetClientInfoAX.cab#version=1,0,0,0"> 
</object> 

<script type="text/javascript"> 
    function OpenActiveX() 
    { 
     var objGetClientInfo = new ActiveXObject("GetClientInfoAx.CGetClient"); 
     if(objGetClientInfo != null) 
     { 
      //For testing only 
      alert(objGetClientInfo.GetClient()); 
     } 
    } 
</script> 

Ensuite, j'ai créé manuellement un fichier .inf comme suit:

[version] 
    signature="$CHICAGO$" 
    AdvancedINF=2.0 
[Add.Code] 
    GetClientInfo101.dll=GetClientInfo101.dll 
    GetClientInfo101.inf=GetClientInfo101.inf 
[GetClientInfo101.dll] 
    file-win32-x86=thiscab 
    clsid={5085C918-0236-4828-BDFA-063FEE57C69B} 
    FileVersion=1,0,0,0 
    RegisterServer=yes 
[GetClientInfo101.inf] 
    file=thiscab 

Cependant, quand je construis mon fichier .cab je reçois également un .OSD de sortie de fichier à la .cab comme suit (je suis préoccupé par le fait qu'il y ait à la fois un .inf et un .OSD fichier dans le même fichier .cab. Est-ce vrai et cela va-t-il causer des problèmes? Je ne suis pas sûr de dire à Visual Studio de ne pas générer le fichier .OSD.

<?XML version="1.0" ENCODING='UTF-8'?> 
<!DOCTYPE SOFTPKG SYSTEM "http://www.microsoft.com/standards/osd/osd.dtd"> 
<?XML::namespace href="http://www.microsoft.com/standards/osd/msicd.dtd" as="MSICD"?> 
<SOFTPKG NAME="GetClientInfoAX" VERSION="1,0,0,0"> 
    <TITLE> GetClientInfoAX </TITLE> 
    <MSICD::NATIVECODE> 
     <CODE NAME="GetClientInfo101"> 
      <IMPLEMENTATION> 
       <CODEBASE FILENAME="GetClientInfo101.dll"> 
       </CODEBASE> 
      </IMPLEMENTATION> 
     </CODE> 
    </MSICD::NATIVECODE> 
</SOFTPKG> 

De toute façon, cela a été un cauchemar en essayant de reconstituer tous les détails de cette. Je serais très reconnaissant pour toute aide pour résoudre ce problème.

OK, le Le Code du projet article A Complete Scriptable ActiveX Web Control Tutorial Using ATL est ce que j'ai utilisé comme un guide pour la signature du fichier .cab. Voir la section intitulée "Signature d'un fichier CAB".

Voici les commandes que j'ai utilisées. Notez que j'ai utilisé Visual Studio pour créer le fichier cab au lieu de CABARC. Notez également Je n'utilise un cert test:

makecert -sv "getclientinfocert.pvk" -n "CN=My Company" getclientinfocert.cer 

cert2spc getclientinfocert.cer getclientinfocert.spc 

pvk2pfx -pvk getclientinfocert.pvk -pi AOTC20467cert -spc getclientinfocert.spc -pfx getclientinfocert.pfx -po AOTC81396pass –f 

signtool sign /f getclientinfocert.pfx /p AOTC81396pass /t http://timestamp.verisign.com/scripts/timstamp.dll /v GetClientInfo101.dll 

signtool sign /f getclientinfocert.pfx /p AOTC81396pass /t http://timestamp.verisign.com/scripts/timstamp.dll /v GetClientInfoAX.cab 

Utilisez certmgr pour exporter et importer « Agence racine » certificat racine cert de confiance:

signtool verify /v /a GetClientInfoAX.cab 

Notez que je copiais ma DLL à mon Windows SDK dossier, signé, copié à mon fichier cab que j'ai ensuite copié sur mon fichier SDK, signé le fichier cab. Enfin, j'ai copié le fichier cab sur mon projet de site Web.

REMARQUE: Voir les commentaires à la fin de la première réponse.J'ai acheté un certificat signé de Comodo et avec cela installé, je reçois maintenant l'erreur "Publisher inconnu" même si le statut du certificat est "OK". Les fichiers DLL et CAB ont tous deux été signés.

Je crois que mon problème est maintenant que le contrôle doit être marqué comme sûr pour les scripts. J'ai trouvé un article récent, Creating an ActiveX control in .NET using C#, ce qui semble très utile.

Répondre

0

Votre version ProgID indépendante de la classe co ComVisible est définie comme

[ProgId("getClientInfoAx.CGetClient")] 

Alors que dans le code JScript le code instanciation est comme

var objGetClientInfo = new ActiveXObject("GetClientInfoAx.CGetClient"); 

S'il vous plaît vérifier la casse d'abord et confirmer le comportement?

+0

Je vais essayer cela et conseiller les résultats, merci. – Jim

+0

Malheureusement, cela ne semble pas faire la différence avec le cas corrigé. Cette chose est douloureuse! – Jim

+0

OK. Avez-vous essayé d'instancier l'objet ActiveX dans votre page Web en utilisant un objet ou un tag d'intégration? Voyez comment cela se comporte. Essayez également d'instancier votre contrôle COM en utilisant VBScript local. Fondamentalement vous devez identifier si le problème est parce que votre ActiveX n'est pas signé et enregistré correctement ou en raison des autorisations de sécurité – byte

Questions connexes