安装 启动 停止 卸载 Windows服务 c#

时间:2021-04-14 17:25:01

问题:windows服务安装时,出错:System.ComponentModel.Win32Exception: 帐户名无效或不存在,

解决:将serviceProcessInstaller1->Accout属性,设为:LocalSystem(默认是User)。

   运行: Installuitl 程序名.exe ,安装成功。

   卸载是  Installuitl /u 程序名.exe 

 

问题:如何不使用InstallUtil 安装 启动 停止 卸载 Windows服务?

解决:用System.Configuration.Install.AssemblyInstaller类加载一个程序集,并运行其中的安装程序。    
    [C#]    
    //安装服务
    public static void InstallService(string filepath, string serviceName, string[] options)
    {
        try
        {
            if (!IsServiceExisted(serviceName))
            {
                IDictionary mySavedState = new Hashtable();
                AssemblyInstaller myAssemblyInstaller = new AssemblyInstaller();
                myAssemblyInstaller.UseNewContext = true;
                myAssemblyInstaller.Path = filepath;
                myAssemblyInstaller.CommandLine = options;
                myAssemblyInstaller.Install(mySavedState);
                myAssemblyInstaller.Commit(mySavedState);
                myAssemblyInstaller.Dispose();
            }
        }
        catch (Exception ex)
        {
            throw new Exception("Install Service Error\n" + ex.Message);
        }
    }
    //卸载服务
    public static void UnInstallService(string filepath, string serviceName, string[] options)
    {
        try
        {
            if (IsServiceExisted(serviceName))
            {
                AssemblyInstaller myAssemblyInstaller = new AssemblyInstaller();
                myAssemblyInstaller.UseNewContext = true;
                myAssemblyInstaller.Path = filepath;
                myAssemblyInstaller.CommandLine = options;
                myAssemblyInstaller.Uninstall(null);
                myAssemblyInstaller.Dispose();
            }
        }
        catch (Exception ex)
        {
            throw new Exception("UnInstall Service Error\n" + ex.Message);
        }
    }
    //判断服务是否存在
    public static bool IsServiceExisted(string serviceName)
    {
        ServiceController[] services = ServiceController.GetServices();
        foreach (ServiceController s in services)
        {
            if (s.ServiceName == serviceName)
            {
                return true;
            }
        }
        return false;
    }
    //启动服务
    public static void StartService(string serviceName)
    {
        if (IsServiceExisted(serviceName))
        {
            System.ServiceProcess.ServiceController service = new System.ServiceProcess.ServiceController(serviceName);
            if (service.Status != System.ServiceProcess.ServiceControllerStatus.Running &&
                service.Status != System.ServiceProcess.ServiceControllerStatus.StartPending)
            {
                service.Start();
                service.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(60));
            }
        }
    }
    //停止服务
    public static void StopService(string serviceName)
    {
        if (IsServiceExisted(serviceName))
        {
            System.ServiceProcess.ServiceController service = new System.ServiceProcess.ServiceController(serviceName);
            if (service.Status == System.ServiceProcess.ServiceControllerStatus.Running)
            {
                service.Stop();
                service.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(60));
            }
        }
    }