Connexion à une interface COM dans un code aspx en arrière s’exécutant sur IIS?

J’ai créé un service Windows (un exe basé sur l’assistant Visual Studio ATL) qui expose une interface COM. Aucun problème lors de l’exécution en tant que serveur In-Proc ou Windows. J’ai besoin d’un service Windows car certains processus doivent être disponibles en dehors des access IIS.

J’ai créé des pages Web (aspx / C #) appelant mon service et tout a bien fonctionné dans Visual Server .NET Development Server. J’essaie maintenant de pousser les pages Web vers IIS 7 (exécuté sur Windows 7) pour des tests supplémentaires. Mais, lorsque les pages sont exécutées sous IIS, les appels à mon interface COM échouent tous avec l’erreur

“La récupération de la fabrique de classes COM pour le composant a échoué en raison de l’erreur suivante: 80070005 L’access est refusé. (Exception de HRESULT: 0x80070005 (E_ACCESSDENIED)).”

J’ai vérifié que le service est:

  • enregistré avec Windows sous HKCR \ Clsid \ (note, je me suis enregistré sous “myservice.exe / RegServer” car regsvr32.exe ne fonctionne qu’avec les fichiers dll)
  • myservice.exe a des droits de lecture et d’exécution pour l’utilisateur IIS_IUSRS
  • est un exe 64 bits (devrait donc charger dans l’espace app-pool IIS par défaut)
  • Fonctionne bien dans le débogueur de .NET Developement Server (mais pas IIS)

Des idées pourquoi cela ne fonctionnerait pas? Quelque chose à voir avec les interfaces COM contenues dans un fichier exe vs dll?

Des possibilités d’IIS appelant une interface COM exposée dans un service Windows?

Je pense que vous devez autoriser l’access au processus du pool d’applications de votre site pour utiliser votre object COM, sous Config DCOM.

  • Aller aux services de composants
  • > Ordinateurs> Poste de travail> twig config DCOM
  • Localisez l’AppID ou le Nom de votre service dans la liste. Cliquez avec le bouton droit dessus et sélectionnez les propriétés.
  • Ouvrez l’onglet Sécurité
  • Sélectionnez Autorisations de lancement et d’activation et sélectionnez Personnaliser.
  • Accordez le processus du pool d’applications (probablement ASPNET, mais vérifiez les propriétés du pool d’applications IIS pour votre site) comme suit: Lancement local et activation locale.

S’il vous plaît laissez-nous savoir si cela résout votre problème.

Incidemment:

> is a 64bit exe (so should load in the default IIS app-pool space) 

Ce n’est pas tout à fait vrai. Le pool d’applications est un processus contrôlé par ISS. Quel que soit le processus, votre service s’exécute indépendamment. Votre service n’a donc rien à voir avec les pools d’applications IIS.

Cela ressemble beaucoup à un problème de sécurité / permissions – assurez-vous d’abord que l’utilisateur sous lequel IIS s’exécute dispose de droits suffisants et vérifie en particulier que votre groupe ASPNET est autorisé à utiliser COM (je pense que ce n’est pas le cas par défaut) .

EDIT – après avoir posté cela, j’ai trouvé un autre message qui pourrait aider – jetez un oeil ici

Merci les gars. J’apprécie vraiment vos réponses. Votre information m’a orienté dans la bonne direction. Le problème était en effet un problème de sécurité \ permissions. Pour aggraver le problème, à chaque fois que je reconstruis mon service, les droits que j’ai définis pour IIS_IUSRS ont été supprimés de l’exécutable. Donc, si vous commencez à voir des erreurs intermittentes accéder à votre object COM pendant le développement, vérifiez les droits sur votre exe après les re-builds! J’espère que cela aide les autres.

Pour terminer, voici comment j’ai résolu le problème:

  • changé l’identité de mon pool d’applications de services en ‘LocalSystem’ (puisque mon COM était dans un service Windows exécuté sous le compte système, la plupart des utilisateurs n’auront pas besoin de ce niveau) (Gestionnaire des services Internet | Pools d’applications | pool | Paramètres avancés | Identité