码迷,mamicode.com
首页 > Windows程序 > 详细

造轮子_Windows服务操作之sc和net命令

时间:2015-12-19 19:09:32      阅读:276      评论:0      收藏:0      [点我收藏+]

标签:

看个粟子:

 1、“新建项目”——“Window服务”技术分享

生成的目录结构

技术分享

双击“MainService.cs”,右键点击“添加安装程序”,自动会生成Projectinstaller.cs文件以及两个安装组件,对两个组件更名并做属性设置:

技术分享

技术分享

技术分享

对服务的启动与停止添加代码

技术分享
using System;
using System.Diagnostics;
using System.IO;
using System.ServiceProcess;
using System.Timers;

namespace MainService
{
    public partial class MainService : ServiceBase
    {
        private Timer time = new Timer();
        public MainService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            WriteLog("服务启动,时间:" + DateTime.Now.ToString("HH:mm:ss") + "\r\n");

            time.Elapsed += new System.Timers.ElapsedEventHandler(MethodEvent);
            time.Interval = 2 * 1000;//时间间隔为2秒钟
            time.Start();
        }

        protected override void OnStop()
        {
            WriteLog("服务停止,时间:" + DateTime.Now.ToString("HH:mm:ss") + "\r\n");
        }

        private void MethodEvent(object source, System.Timers.ElapsedEventArgs e)
        {
            time.Enabled = false;

            string result = string.Empty;
            string startTime = DateTime.Now.ToString("HH:mm:ss");
            try
            {
                //.........

                result = "执行成功,时间为:" + startTime;
            }
            catch (Exception exp)
            {
                result = "失败,原因:" + exp.Message;
            }
            finally
            {
                WriteLog(result);

                time.Enabled = true;
            }
        }

        /// <summary>
        /// 日志记录
        /// </summary>
        /// <param name="logInfo"></param>
        public void WriteLog(string logInfo)
        {
            try
            {
                string logDirectory = AppDomain.CurrentDomain.BaseDirectory + "\\Logs";
                if (!Directory.Exists(logDirectory))
                {
                    Directory.CreateDirectory(logDirectory);
                }
                string filePath = logDirectory + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt";
                File.AppendAllText(filePath, logInfo);
            }
            catch
            {
            }
        }
    }
}
View Code

添加windows窗体应用程序,命名为:InstallService

对启动程序添加代码:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;

namespace InstallService
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("这是Windows应用程序");
            Console.WriteLine("请选择,[1]安装服务 [2]卸载服务 [3]退出");
  
 
            var rs = int.Parse(Console.ReadLine());
            switch (rs)
            {
                case 1:
                    //取当前可执行文件路径,加上"s"参数,证明是从windows服务启动该程序
                    var path = Process.GetCurrentProcess().MainModule.FileName;
                    Process.Start("sc", "create myserver binpath= \"" + path + "\" displayName=MainService start= auto");
                    //因sc命令安装后未看到描述,我怀疑安装的服务不一定是我所创建的MainService服务项目,这为添加描述
                    Process.Start("sc", "description myserver \"利用空闲的网络带宽在后台传输文件。如果服务被停用,例如 Windows Update 和 MSN Explorer 的功能将无法自动下载程序和其他信息。如果此服务被禁用,任何依赖它的服务如果没有容错技术以直接通过 IE 传输文件,一旦 BITS 被禁用,就可能无法传输文件。\"");
                    Console.WriteLine("安装成功");
                    Console.Read();
                    break; 
                case 2:
                    Process.Start("sc", "delete myserver");
                    Console.WriteLine("卸载成功");
                    Console.Read();
                    break; 
                case 3: 
                    break;
            }
        }
    }
}

启动程序:

技术分享

1安装后

运行“services.msc"打开服务管理器

技术分享

我手动启动失败

技术分享

所以我怀疑我安装的只是一个名字,与我添加的服务没有什么关系

选2

卸载成功

可看net命名安装与卸载可参看:http://www.cnblogs.com/qk2014/p/4869675.html

 

windows服务操作命令有sc和net 两个命令;

使用sc命令:

1 修改服务启动类型

sc config 服务名 start= demand (设置服务为手动启动)

start= auto (设置服务为自动启动)

start= disabled (设置服务为禁用)

2 安装服务:sc create 服务名

3 停止服务:sc stop 服务名

4 卸载服务:sc delete 服务名(卸载前先停止服务)

 

使用net命令

查看运行的服务: net start

启动服务: net start 服务名

停止服务: net stop 服务名

卸载服务: 服务名 -uninstall (卸载前先停止服务)

 

虽然2个都能达到停止服务和启动服务的效果,但是在重启服务时,就是使用批处理先stop后start来实现重启时,如果服务处于启动状态使用sc的stop后start,结果服务不能启动,因为sc命令在执行stop后不会等待马上继续执行批处理下面的语句,这时服务正在处于停止操作状态,所以start命令不能启动。

 

net命令在stop时会停止等待,在服务完全停止后再继续执行批处理后面的语句,所以net的重启命令就会正常。

 

厂址:

http://www.cnblogs.com/testlife007/p/4396248.html

http://www.cnblogs.com/DelphiFan/archive/2009/03/10/1645579.html

http://www.cnblogs.com/a311300/archive/2010/12/30/1922229.html

http://www.cnblogs.com/wpcnblog/p/4732390.html

http://www.cnblogs.com/zcy-628/archive/2012/08/22/2650805.html

http://www.cnblogs.com/qk2014/p/4869675.html

http://www.cnblogs.com/smileberry/p/4210245.html

 

造轮子_Windows服务操作之sc和net命令

标签:

原文地址:http://www.cnblogs.com/shy1766IT/p/5059523.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!