web-dev-qa-db-fra.com

Installation d'un service Windows auto-développé

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

Installing Assembly 'c:\Users\brwatson\Development\Projects\TweetLinks\TweetLinkQueue\bin\Debug\TweetLinkQueue.exe'.
Affected parameters are:
   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
Installing service TweetLinkService...
Creating EventLog source TweetLinkService in log Application...
Rolling back Assembly 'c:\Users\brwatson\Development\Projects\TweetLinks\TweetLinkQueue\bin\Debug\TweetLinkQueue.exe'.
Affected parameters are:
   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
Restoring event log to previous state for source TweetLinkService.
An exception occurred during the Rollback phase of the System.Diagnostics.EventLogInstaller installer.
System.Security.SecurityException: The source was not found, but some or all event logs could not be searched.  Inaccessible logs: Security.
An exception occurred during the Rollback phase of the installation. This exception will be ignored and the rollback will continue. However, the machine might not fully revert to its initial state after the rollback is complete.

Comme vous pouvez le constater, cela ne fonctionne pas. Je ne suis pas sûr de savoir comment procéder et j'ai frappé le mur avec Bing et Google. J'ai défini le compte sur LocalSystem pour le serviceProcessInstaller1. Le code compile bien, mais maintenant j'aimerais lancer la chose ... des idées? Je suis un administrateur sur ma boîte et je lance la commande:

InstallUtil TweetLinkQueue.exe

depuis la console d'administration VS2008.

MISE À JOUR AVEC l'option/ShowCallStack

Pile d'appels

An exception occurred during the Install phase.
System.Security.SecurityException: The source was not found, but some or all eve
nt logs could not be searched.  Inaccessible logs: Security.
   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!");
    }
}

MISE À JOUR avec ENtry Point:

namespace TweetLinkQueue
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main()
        {
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] 
            { 
                new TweetLinkService() 
            };
            ServiceBase.Run(ServicesToRun);
        }
    }
}
35
Brandon Watson

Je ne sais pas 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 bien fait cette partie. Vous pouvez faire référence au pas à pas ici . EDIT: REGARDEZ SPÉCIFIQUEMENT AT ÉTAPE 9. Il se peut que le problème soit dû au fait que vous modifiez le journal des applications au lieu d'un journal spécifique à votre application.

Il n'y a rien de mal à utiliser InstallUtil, mais si vous devez installer votre service sur une machine étrangère, InstallUtil n'est pas garanti. Vous pouvez suivre cette procédure étape par étape pour que votre service Windows puisse s’installer/désinstaller lui-même sans avoir à installer InstallUtil. Voir ici pour ces instructions.

13
Matt Davis

Je viens d'avoir ce problème et c'est parce que je n'exécutais pas ma commande Visual Studio Prompt en tant qu'administrateur.

115
Tom B

Pour résoudre ce problème, cliquez avec le bouton droit de la souris sur votre invite Visual Studio 2008, puis cliquez sur Exécuter en tant qu'administrateur, puis exécutez votre commande comme suit: installutil C:\mcWebService\bin\Debug\mcWebService.exe. Espérons que cela résoudra votre solution.

8
Arifur Rahman

Le compte LocalSystem n’a normalement pas l’autorisation de lire le journal des événements de sécurité (ni 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énement que vous pouvez exécuter avec vos propres informations d'identification de niveau administration sur tout ordinateur sur lequel vous souhaitez exécuter cette opération. Cela pourrait même valoir la peine d’essayer cela 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 l'exécutez, est-ce que ça réussit? Vous pouvez le vérifier en consultant les propriétés du journal des applications et en parcourant les sources d'événements dans l'onglet Filtre. 

Alternativement, étant donné que les services doivent de toute façon être installés, vous pouvez ajouter une EventLogInstaller (qui porte un faux nom: il s'agit en réalité d'un 'EventSourceInstaller' qui créera EventLogs si nécessaire) à l'assembly au lieu d'utiliser EventLog.CreateEventSource dans le constructeur du service.

2
Jeff Sternal

Mon problème était qu'une fenêtre s'ouvrait pour entrer les informations d'identification et je saisissais mon nom d'utilisateur sans le domaine. Une fois que j'ai entré domain\username tout allait bien.

0
CodingYoshi

J'ai eu les mêmes erreurs inexplicables lors de l'installation des services Windows . Dans notre cas, l'utilisateur était le problème.

L'installation du serveur avec l'administrateur-utilisateur a fonctionné, mais pas pour un administrateur local. Toutefois, ceci n’est pas une solution préférée, nous avons donc utilisé ces informations pour créer un autre utilisateur susceptible d’installer le service.

0
hormberg