49 votes

Utilisation de InstallUtil et configuration silencieuse d'un nom d'utilisateur et d'un mot de passe de connexion au service Windows

Je dois utiliser InstallUtil pour installer un service Windows en C#. Je dois définir les informations d'identification de connexion du service (nom d'utilisateur et mot de passe). Tout cela doit être fait de manière silencieuse.

Y a-t-il un moyen de faire quelque chose comme ceci :

installutil.exe myservice.exe /customarg1=username /customarg2=password

70voto

Jimbo Points 399

Une façon beaucoup plus facile que les messages ci-dessus et sans code supplémentaire dans votre programme d'installation consiste à utiliser ce qui suit :

installUtil.exe /username=domain\username /password=password /unattended C:\My.exe

Assurez-vous simplement que le compte que vous utilisez est valide. Sinon, vous recevrez une exception "Aucun mappage entre les noms de compte et les identifiants de sécurité n'a été effectué".

52voto

Dean Hill Points 2006

Bravo à mon collègue (Bruce Eddy). Il a trouvé un moyen de faire cet appel en ligne de commande :

installutil.exe /user=uname /password=pw myservice.exe

Cela se fait en remplaçant OnBeforeInstall dans la classe d'installateur :

namespace Test
{
    [RunInstaller(true)]
    public class TestInstaller : Installer
    {
        private ServiceInstaller serviceInstaller;
        private ServiceProcessInstaller serviceProcessInstaller;

        public OregonDatabaseWinServiceInstaller()
        {
            serviceInstaller = new ServiceInstaller();
            serviceInstaller.StartType = System.ServiceProcess.ServiceStartMode.Automatic;
            serviceInstaller.ServiceName = "Test";
            serviceInstaller.DisplayName = "Test Service";
            serviceInstaller.Description = "Test";
            serviceInstaller.StartType = ServiceStartMode.Automatic;
            Installers.Add(serviceInstaller);

            serviceProcessInstaller = new ServiceProcessInstaller();
            serviceProcessInstaller.Account = ServiceAccount.User; 
            Installers.Add(serviceProcessInstaller);
        }

        public string GetContextParameter(string key)
        {
            string sValue = "";
            try
            {
                sValue = this.Context.Parameters[key].ToString();
            }
            catch
            {
                sValue = "";
            }
            return sValue;
        }

        // Remplacer la méthode 'OnBeforeInstall'.
        protected override void OnBeforeInstall(IDictionary savedState)
        {
            base.OnBeforeInstall(savedState);

            string username = GetContextParameter("user").Trim();
            string password = GetContextParameter("password").Trim();

            if (username != "")
                serviceProcessInstaller.Username = username;
            if (password != "")
                serviceProcessInstaller.Password = password;
        }
    }
}

5voto

Josua Points 91

InstallUtil.exe définit StartupType=Manual

Si vous voulez démarrer automatiquement le service, utilisez :

sc config MonNomDeService start= auto

(notez qu'il doit y avoir un espace après '=')

1voto

blowdart Points 28735

Non, installutil ne prend pas en charge cela.

Bien sûr, si vous avez écrit un programme d'installation avec une action personnalisée, vous pourriez l'utiliser dans le cadre d'un MSI ou via installutil.

0voto

william Points 49

Vous pouvez également forcer votre service à s'exécuter en tant qu'utilisateur en utilisant ServiceProcessInstaller::Account = ServiceAccount.User;

Une fenêtre contextuelle demandant "[domain\] utilisateur, mot de passe" apparaîtra pendant l'installation du service.

public class MyServiceInstaller : Installer
{
    /// Constructeur public pour WindowsServiceInstaller
    public MyServiceInstaller()
    {
        ServiceProcessInstaller serviceProcessInstaller = new ServiceProcessInstaller();
        ServiceInstaller serviceInstaller = new ServiceInstaller();

        //# Informations sur le compte du service
        serviceProcessInstaller.Account = ServiceAccount.User; // et non LocalSystem;
     ....

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