Exécution d’une application graphique en mode service Windows

J’écris un serveur fonctionnant comme un service Windows qui, par requête, appelle Firefox pour générer un instantané pdf d’une page Web.

Je sais que c’est une mauvaise idée d’exécuter un programme GUI en mode service, mais la nature du serveur de mon programme ne peut l’exécuter en mode utilisateur. L’exécution d’un proxy au niveau utilisateur n’est pas non plus une option, car il se peut qu’aucun utilisateur interactif ne soit connecté sur la machine lorsque le serveur est en cours d’exécution.

Dans mes expériences, Firefox a produit avec succès le pdf lorsque le service était exécuté sous un compte utilisateur déjà connecté. De toute évidence, cela n’a pas fonctionné dans d’autres cas: pour les systèmes locaux et les comptes d’utilisateurs qui n’étaient pas connectés. Sous LocalSystem avec l’option «Autoriser le service à interagir avec le bureau» activée, je pouvais voir que Firefox signalait qu’il était impossible de trouver une imprimante.

Comme il ne serait pas pratique d’exiger une session utilisateur ouverte pour que le serveur pdf s’exécute, existe-t-il une solution à ce problème, à l’exception de l’exécution complète de la machine virtuelle?

MISE À JOUR: Je pensais que le problème n’était pas vraiment lié aux permissions de compte, mais à une boîte de dialog modale invisible que FF attendait en mode service.

Cependant, il est toujours impossible de créer un pdf lorsque FF s’exécute sous le compte LocalSystem. FF dit ne pas trouver d’imprimante et je me demande si c’est une permission qui pourrait être activée d’une manière ou d’une autre?

Vous voudrez peut-être essayer une approche différente dans laquelle vous incluez une bibliothèque PDF .NET ( PDFsharp est un bon, open source, choix) dans votre projet et que vous l’utilisez avec le contrôle WebBrowser que vous incluez également dans votre projet. rendre le PDF.

N’oubliez pas d’utiliser l’atsortingbut STAThread si vous essayez ceci.

J’ai été confronté à une énigme similaire avec MS Word sans surveillance. Ce que vous devez faire est de vous connecter en tant qu’utilisateur que vous avez configuré pour exécuter le processus firefox et passer par le processus de configuration des imprimantes.

Il est possible que la simple connexion en tant que cet utilisateur soit suffisante – il y a des choses qui ont été effectuées lors de la première connexion.

Je m’excuse, je n’étais pas assez clair – je veux dire que vous devez vous connecter de manière interactive en utilisant ce compte, configurer l’imprimante par défaut, vous déconnecter, puis exécuter votre service

Pouvez-vous exécuter le programme en tant que tâche planifiée à la place? La tâche peut être affectée à un compte utilisateur donné qui doit contourner les limitations du service.

Il y a quelques années, j’ai rencontré un problème connexe: Imprimante réseau partagée lors du démarrage d’un pseudo-périphérique Ghostscript pour la traduction PS-> PCL et impression sur une imprimante réelle. Le service d’impression-spouleur s’exécute en tant que système local et le pilote de pseudo-périphérique ne parvient pas à exécuter Ghostscript à partir du mode service. J’ai pu résoudre le problème en copiant quelques clés de registre de la hive HKCU vers HKLM.