86 votes

Comment faire un démarrage du Service Windows .NET juste après l’installation ?

Par ailleurs le service. StartType = ServiceStartMode.Automatic mon service ne démarre pas après l’installation

Solution

Insérer ce code sur mon ProjectInstaller

Merci à ScottTx et de la Francis B.

179voto

Matt Davis Points 22019

J'ai posté une étape par étape la procédure pour la création d'un service Windows en C# ici. On dirait que vous vous êtes au moins sur ce point, et maintenant vous vous demandez comment faire pour démarrer le service une fois qu'il est installé. Le réglage de la propriété Démarrertype Automatique va entraîner le service démarre automatiquement après le redémarrage de votre système, mais il ne sera pas (comme vous l'avez découvert) démarrer automatiquement votre service après l'installation.

Je ne me souviens pas où je l'ai trouvé à l'origine (peut-être Marc Gravel?), mais j'ai trouvé une solution en ligne qui vous permet d'installer et démarrer le service en cours d'exécution de votre service lui-même. Voici, étape par étape:

  1. La Structure de l' Main() fonction de votre service comme ceci:

    static void Main(string[] args)
    {
        if (args.Length == 0) {
            // Run your service normally.
            ServiceBase[] ServicesToRun = new ServiceBase[] {new YourService()};
            ServiceBase.Run(ServicesToRun);
        } else if (args.Length == 1) {
            switch (args[0]) {
                case "-install":
                    InstallService();
                    StartService();
                    break;
                case "-uninstall":
                    StopService();
                    UninstallService();
                    break;
                default:
                    throw new NotImplementedException();
            }
        }
    }
    
  2. Voici le code de prise en charge:

    using System.Collections;
    using System.Configuration.Install;
    using System.ServiceProcess;
    
    private static bool IsInstalled()
    {
        using (ServiceController controller = 
            new ServiceController("YourServiceName")) {
            try {
                ServiceControllerStatus status = controller.Status;
            } catch {
                return false;
            }
            return true;
        }
    }
    
    private static bool IsRunning()
    {
        using (ServiceController controller = 
            new ServiceController("YourServiceName")) {
            if (!IsInstalled()) return false;
            return (controller.Status == ServiceControllerStatus.Running);
        }
    }
    
    private static AssemblyInstaller GetInstaller()
    {
        AssemblyInstaller installer = new AssemblyInstaller(
            typeof(YourServiceType).Assembly, null);
        installer.UseNewContext = true;
        return installer;
    }
    
  3. En continuant avec le code de prise en charge...

    private static void InstallService()
    {
        if (IsInstalled()) return;
    
        try {
            using (AssemblyInstaller installer = GetInstaller()) {
                IDictionary state = new Hashtable();
                try {
                    installer.Install(state);
                    installer.Commit(state);
                } catch {
                    try {
                        installer.Rollback(state);
                    } catch { }
                    throw;
                }
            }
        } catch {
            throw;
        }
    }
    
    private static void UninstallService()
    {
        if ( !IsInstalled() ) return;
        try {
            using ( AssemblyInstaller installer = GetInstaller() ) {
                IDictionary state = new Hashtable();
                try {
                    installer.Uninstall( state );
                } catch {
                    throw;
                }
            }
        } catch {
            throw;
        }
    }
    
    private static void StartService()
    {
        if ( !IsInstalled() ) return;
    
        using (ServiceController controller = 
            new ServiceController("YourServiceName")) {
            try {
                if ( controller.Status != ServiceControllerStatus.Running ) {
                    controller.Start();
                    controller.WaitForStatus( ServiceControllerStatus.Running, 
                        TimeSpan.FromSeconds( 10 ) );
                }
            } catch {
                throw;
            }
        }
    }
    
    private static void StopService()
    {
        if ( !IsInstalled() ) return;
        using ( ServiceController controller = 
            new ServiceController("YourServiceName")) {
            try {
                if ( controller.Status != ServiceControllerStatus.Stopped ) {
                    controller.Stop();
                    controller.WaitForStatus( ServiceControllerStatus.Stopped, 
                         TimeSpan.FromSeconds( 10 ) );
                }
            } catch {
                throw;
            }
        }
    }
    
  4. À ce point, après l'installation de votre service sur la machine cible, il suffit d'exécuter à votre service à partir de la ligne de commande (comme toute application ordinaire) avec l' -install argument de ligne de commande pour installer et démarrer le service.

Je pense que j'ai couvert tout, mais si vous trouvez cela ne fonctionne pas, s'il vous plaît laissez-moi savoir afin que je puisse mettre à jour la réponse.

22voto

ScottTx Points 1306

Vous pouvez faire tout cela de dans votre exécutable en réponse aux événements déclenchés à partir du processus InstallUtil du service. Substituer l’événement OnAfterInstall pour utiliser une classe ServiceController pour démarrer le service.

http://msdn.Microsoft.com/en-US/Library/System.ServiceProcess.ServiceInstaller.aspx

7voto

Francis B. Points 4109

Visual Studio

Si vous créez un projet d'installation avec VS, vous pouvez créer une action personnalisée qui appelle une .NET méthode pour démarrer le service. Mais, il n'est pas vraiment recommandé d'utiliser géré action personnalisée dans une MSI. Voir cette page.

ServiceController controller  = new ServiceController();
controller.MachineName = "";//The machine where the service is installed;
controller.ServiceName = "";//The name of your service installed in Windows Services;
controller.Start();

InstallShield ou Sage

Si vous utilisez InstallShield ou Sages, ces applications offrent la possibilité de démarrer le service. Par exemple avec Sage, vous devez ajouter un service de contrôle de l'action. Dans cette action, vous devez spécifier si vous souhaitez démarrer ou arrêter le service.

Wix

À l'aide de Wix, vous devez ajouter le code xml suivant sous le composant de votre service. Pour plus d'informations à ce sujet, vous pouvez consulter cette page.

<ServiceInstall 
    Id="ServiceInstaller"  
    Type="ownProcess"  
    Vital="yes"  
    Name=""  
    DisplayName=""  
    Description=""  
    Start="auto"  
    Account="LocalSystem"   
    ErrorControl="ignore"   
    Interactive="no">  
        <ServiceDependency Id="????"/> ///Add any dependancy to your service  
</ServiceInstall>

6voto

Otávio Décio Points 44200

Vous devez ajouter une Action personnalisée à la fin de la séquence de « ExecuteImmediate » dans le fichier MSI, utilisez le nom de l’EXE ou d’un lot (début sc) composant comme source. Je ne pense pas que cela peut être fait avec Visual Studio, vous devrez peut-être utiliser un MSI véritable outil de création pour cela.

5voto

Matt Points 5526

Pour le lancer juste après l’installation, je génère un fichier de commandes avec installutil suivi de sc start

Il n’est pas idéal, mais ça marche...

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