35 votes

Installer un service Windows autodéveloppé

Je essaie de déployer un service que j'ai écrit. Voici le fichier InstallLog :

Installation de l'assembly 'c:\Users\brwatson\Development\Projects\TweetLinks\TweetLinkQueue\bin\Debug\TweetLinkQueue.exe'.
Les paramètres affectés sont :
   logtoconsole = 
   assemblypath = c:\Users\brwatson\Development\Projects\TweetLinks\TweetLinkQueue\bin\Debug\TweetLinkQueue.exe
   logfile = c:\Users\brwatson\Development\Projects\TweetLinks\TweetLinkQueue\bin\Debug\TweetLinkQueue.InstallLog
Installation du service TweetLinkService...
Création de la source EventLog TweetLinkService dans le journal Application...
Rolling back de l'assembly 'c:\Users\brwatson\Development\Projects\TweetLinks\TweetLinkQueue\bin\Debug\TweetLinkQueue.exe'.
Les paramètres affectés sont :
   logtoconsole = 
   assemblypath = c:\Users\brwatson\Development\Projects\TweetLinks\TweetLinkQueue\bin\Debug\TweetLinkQueue.exe
   logfile = c:\Users\brwatson\Development\Projects\TweetLinks\TweetLinkQueue\bin\Debug\TweetLinkQueue.InstallLog
Restauration du journal d'événements à l'état précédent pour la source TweetLinkService.
Une exception s'est produite pendant la phase de rollback de l'installateur System.Diagnostics.EventLogInstaller.
System.Security.SecurityException : La source n'a pas été trouvée, mais certains journaux d'événements ne peuvent pas être consultés. Journaux inaccessibles : Sécurité.
Une exception s'est produite pendant la phase de rollback de l'installation. Cette exception sera ignorée et le rollback se poursuivra. Cependant, la machine pourrait ne pas revenir entièrement à son état initial après la fin du rollback.

Comme vous pouvez le constater, cela ne fonctionne pas. Je ne sais pas comment procéder, et j'ai repris le mur avec Bing et Google. J'ai défini le compte sur LocalSystem pour le serviceProcessInstaller1. Le code se compile bien, mais maintenant j'aimerais exécuter la chose...des idées ? Je suis administrateur sur ma boîte, et j'exécute la commande :

InstallUtil TweetLinkQueue.exe

depuis la console d'administration VS2008.

MIS À JOUR AVEC l'option /ShowCallStack

Call Stack

Une exception s'est produite pendant la phase d'installation.
System.Security.SecurityException : La source n'a pas été trouvée, mais certains journaux d'événements ne peuvent pas être consultés. Journaux inaccessibles : Sécurité.
   at System.Diagnostics.EventLog.FindSourceRegistration(String source, String m
achineName, Boolean readOnly)
   at System.Diagnostics.EventLog.SourceExists(String source, String machineName
)
   at System.Diagnostics.EventLogInstaller.Install(IDictionary stateSaver)
   at System.Configuration.Install.Installer.Install(IDictionary stateSaver)
   at System.ServiceProcess.ServiceInstaller.Install(IDictionary stateSaver)
   at System.Configuration.Install.Installer.Install(IDictionary stateSaver)
   at System.Configuration.Install.Installer.Install(IDictionary stateSaver)
   at System.Configuration.Install.AssemblyInstaller.Install(IDictionary savedSt
ate)
   at System.Configuration.Install.Installer.Install(IDictionary stateSaver)
   at System.Configuration.Install.TransactedInstaller.Install(IDictionary saved
State)

et voici le constructeur :

public TweetLinkService()
{
    InitializeComponent();

    if (!EventLog.SourceExists("TweetLinkQueue"))
    {
        EventLog.CreateEventSource("TweetLinkQueue", "Log");

        TweetLinksLog.Source = "TweetLinkQueue";
        TweetLinksLog.Log = "Log";

        TweetLinksLog.WriteEntry("Log Created!");
    }
}

MIS À JOUR avec le point d'entrée :

namespace TweetLinkQueue
{
    static class Program
    {
        /// 
        /// Le point d'entrée principal de l'application.
        /// 
        static void Main()
        {
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] 
            { 
                new TweetLinkService() 
            };
            ServiceBase.Run(ServicesToRun);
        }
    }
}

0 votes

Obtenez-vous des informations supplémentaires si vous exécutez installutil avec l'option /ShowCallStack?

0 votes

Les informations du fichier journal se trouvent dans la question ci-dessus.

0 votes

L'utilisateur avec lequel vous essayez d'installer le service a-t-il l'autorisation d'écrire dans le journal des événements de sécurité?

122voto

Tom B Points 1293

Je venais de rencontrer ce problème et c'était parce que je n'exécutais pas mon invite de commandes de visual studio en tant qu'administrateur.

0 votes

Cela explique pourquoi cela a fonctionné sur ma machine mais pas en production

2 votes

J'ai créé un fichier BAT pour installer le service et j'exécutais le fichier BAT en tant qu'administrateur (clic droit sur le fichier BAT et sélectionner l'option "exécuter en tant qu'administrateur"), mais cela ne fonctionnait pas. Pour le faire fonctionner, j'ai exécuté en tant qu'administrateur une invite de commande (cmd.exe) au lieu du fichier BAT. Ensuite, je l'ai installé manuellement et cela a fonctionné.

0 votes

Merci! C'était mon problème et avec Exécuter en tant qu'administrateur sur CMD, ça fonctionne bien!

14voto

Matt Davis Points 22019

Je ne suis pas sûr de quel est votre problème spécifique. Il me semble que le problème se produit lors de la création de la source EventLog. Vérifiez que vous avez correctement fait cette partie. Vous pouvez vous référer à l'étape par étape ici. EDIT: REGARDEZ SPÉCIFIQUEMENT L'ÉTAPE 9. Le problème peut se produire parce que vous interférez avec le journal Application au lieu d'un spécifique à votre application.

Il n'y a rien de mal à utiliser InstallUtil, mais si vous avez besoin d'installer votre service sur une machine étrangère, InstallUtil n'est pas garanti d'être là. Vous pouvez suivre cette étape par étape pour rendre votre service Windows exécutable s'installer/désinstaller sans avoir besoin d'InstallUtil. Voir ici pour ces instructions.

8voto

Arifur Rahman Points 31

Pour résoudre ce problème, cliquez avec le bouton droit sur votre invite de commandes Visual Studio 2008 et cliquez sur "Exécuter en tant qu'administrateur", puis exécutez votre commande comme installutil C:\mcWebService\bin\Debug\mcWebService.exe ensuite il vous affichera un message de succès. J'espère que cela résoudra votre problème.

2voto

Jeff Sternal Points 30147

Le compte LocalSystem n'a généralement pas la permission de lire le journal des événements de sécurité (ou de créer des sources d'événements).

La solution la plus simple et la plus sûre consiste à créer un programme d'installation de source d'événements que vous pouvez exécuter sous vos propres autorisations d'administration sur n'importe quelle machine pour laquelle vous souhaitez exécuter cela. Il vaudrait même la peine d'essayer ceci comme un simple test, juste pour voir si votre compte a la permission de le faire.

class Program {
    static void Main(string[] args) {
        EventLog.CreateEventSource("TestSource", "Application");
    }
}

Si vous exécutez cela, est-ce que cela réussit? Vous pouvez vérifier en regardant les propriétés du journal Application et en parcourant les sources d'événements de son onglet Filtre.

Alternativement, étant donné que les services doivent de toute façon être installés, vous pourriez ajouter un EventLogInstaller (qui est mal nommé - c'est vraiment un 'EventSourceInstaller' qui créera EventLogs au besoin) à l'assembly au lieu d'utiliser EventLog.CreateEventSource dans le constructeur du service.

0 votes

Oui. Voir le code suivant l'étape 9 à stackoverflow.com/questions/593454/… pour un exemple de comment faire cela.

0voto

CodingYoshi Points 17416

Mon problème était qu'une fenêtre apparaissait pour entrer des informations d'identification et je rentrais mon nom d'utilisateur sans le domaine. Une fois que j'ai entré domaine\nom d'utilisateur tout était résolu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X