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.
Je vais essayer cela et conseiller les résultats, merci. – Jim
Malheureusement, cela ne semble pas faire la différence avec le cas corrigé. Cette chose est douloureuse! – Jim
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