C# Windows 服务

前两天公司要做一个windows服务,要我提供下。顺手就做了一个壳 现在跟大家分享下:

1.打开VS(我的是2010),新建一个项目选择“Window 服务” :

2. 右击 “Service1.cs 设计”  选择 "添加安装程序" :

 

3. 在 “Service1.cs 设计”  中 把 ServiceName 设置为 "ServiceTest"(用户可以自己定义),然后 选中serviceInstaller1 把 ServiceName 设置跟之前"Service1.cs 设计"中的一样,还有几个属性设置:

 这些属性的作用就不叙述了,自己去了解。

接下来 选中 serviceProcessInstaller1 设置属性:

Ok,现在是写服务的工作了

右击 在 “Service1.cs 设计”  查看代码,打开如图:

这个是用户要写自己的逻辑,我这就不叙述了。

好了,现在服务是写了  该安装了。

新建一个window Form 程序,我就不贴新建图了 直接看最后的图:

现在是贴代码了:

        private void btnInstall_Click(object sender, EventArgs e)
        {
            if (!ServiceIsExisted("ServiceTest"))
            {
                try
                {
                    string CurrentDirectory = System.Environment.CurrentDirectory;
                    System.Environment.CurrentDirectory = CurrentDirectory + "\\Service";
                    ManagedInstallerClass.InstallHelper(new string[] { "WindowsServiceTest.exe" });
                    System.Environment.CurrentDirectory = CurrentDirectory;
                    LabelTooptip.Text = "安装成功!";
                }
                catch (Exception ex)
                {
                    LabelTooptip.Text = "安装出错:" + ex.Message;
                }
            }
            else
            {
                LabelTooptip.Text = "该服务已经安装,如需重装请先卸载!";
            
            }
      
        }

        private void btnUnInstall_Click(object sender, EventArgs e)
        {
            if (ServiceIsExisted("ServiceTest"))
            {
                try
                {
                    string CurrentDirectory = System.Environment.CurrentDirectory;
                    System.Environment.CurrentDirectory = CurrentDirectory + "\\Service";
                    ManagedInstallerClass.InstallHelper(new string[] {"/u" ,"WindowsServiceTest.exe" });
                    System.Environment.CurrentDirectory = CurrentDirectory;
                    LabelTooptip.Text = "卸载成功!";
                }
                catch (Exception ex)
                {
                    LabelTooptip.Text = "卸载出错:" + ex.Message;
                }
            }
            else
            {
                LabelTooptip.Text = "您要卸载的服务不存在!";
            }


        }



        private void btnStart_Click(object sender, EventArgs e)
        {
            try
            {
                ServiceController serviceController = new ServiceController("ServiceTest");
                serviceController.Start();
                LabelTooptip.Text = "服务启动成功!";
            }
            catch (Exception ex)
            {
                LabelTooptip.Text = "服务启动出错:" + ex.Message;
            }
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            try
            {
                ServiceController serviceController = new ServiceController("ServiceTest");
                if (serviceController.CanStop)
                    serviceController.Stop();
                LabelTooptip.Text = "服务停止成功!";
            }
            catch (Exception ex)
            {
                LabelTooptip.Text = "服务停止出错:" + ex.Message;
            }

        }

        private bool ServiceIsExisted(string svcName)
        {
            ServiceController[] services = ServiceController.GetServices();
            foreach (ServiceController s in services)
            {
                if (s.ServiceName == svcName)
                {
                    return true;
                }
            }
            return false;
        } 

  到这里基本就OK ,但是还有一个问题就是这个程序必须已管理员运行 所以在 Form 程序的 Program.cs 里加上一段代码, 如下代码:

  static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            /**
           * 当前用户是管理员的时候,直接启动应用程序
           * 如果不是管理员,则使用启动对象启动程序,以确保使用管理员身份运行
           */
            //获得当前登录的Windows用户标示
            System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
            System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
            //判断当前登录用户是否为管理员
            if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
            {
                //如果是管理员,则直接运行
                Application.Run(new Form1());
            }
            else
            {
                //创建启动对象
                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                startInfo.UseShellExecute = true;
                startInfo.WorkingDirectory = Environment.CurrentDirectory;
                startInfo.FileName = Application.ExecutablePath;
                //设置启动动作,确保以管理员身份运行
                startInfo.Verb = "runas";
                try
                {
                    System.Diagnostics.Process.Start(startInfo);
                }
                catch
                {
                    return;
                }

            }
        }

现在是大功告成了。测试如下:

在这里我声明下,我也是看了网上的一些人的资料才完成的,当时没有记录人家的网址,在这里先谢谢人家提供的资料。

如果有问题或者有更好的处理欢迎指点!

附 源代码:

 https://files.cnblogs.com/files/startlearn/WindowsServiceTest.zip

posted on 2015-05-13 10:08  MyFlyFish  阅读(975)  评论(6编辑  收藏  举报

导航