新建了一个windows服务,关机再开机能够自启动,但是用cmd命令行创建此服务需要手动启动

.Net技术 码拜 8年前 (2016-04-29) 1847次浏览
有没有什么方法,创建此windows服务之后,不用手动启动,一运行此windows服务,它就自启动了?
现在这个windows方法,运行完毕之后,需要手动去启动,但是关机开机之后他能自启动,本人想要的是,运行完毕之后能达到像开机关机之后自启动这个情况,希望各位高手指点
解决方案

10

本人去看下Program.cs的Main函数吧
默认假如是服务的话通过ServiceBase.Run来运行
你可以本人加个参数,直接执行相应的方法

10

你可以把一个windows service工程(修改应用程序属性)重新设置为“控制台应用”,然后以你说得控制台方式执行。
控制台方式的 main 可以这样写(例如)

        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
#if !DEBUG
                ServiceBase.Run(new Service());
#else
                ShowHelp();
#endif
                return;
            }
            if (args.Contains("-i"))
            {
                Uninstall(true);
                端口.ForEach(p => 打开防火墙(p));
                Install();
                return;
            }
            if (args.Contains("-u"))
            {
                Uninstall();
                return;
            }
            if (args.Contains("-t"))
            {
                Uninstall(true);
                Execute(true);
                Console.WriteLine("系统进入Pending状态。请按 Ctrl+Break 退出.....");
                var eh = new ManualResetEvent(false);
                Console.CancelKeyPress += (s, e) =>
                {
                    eh.Set();
                };
                eh.WaitOne();
                return;
            }
            ShowHelp();
        }
        private static void ShowHelp()
        {
            Console.WriteLine("命令参数格式:");
            Console.WriteLine("\t-i:安装windows服务。");
            Console.WriteLine("\t-u:卸载windows服务。");
            Console.WriteLine("\t-t:以控制台方式执行服务。");
        }
        private static void 打开防火墙(int port)
        {
            var inf = new ProcessStartInfo
            {
                UseShellExecute = true,
                FileName = "netsh",
                Arguments = " firewall set portopening TCP " + port,
                WindowStyle = ProcessWindowStyle.Hidden
            };
            var p = Process.Start(inf);
            p.WaitForExit();
        }
        private static void Uninstall(bool 独立窗口 = false)
        {
            Console.WriteLine("停止 " + SvrName);
            var info = new ProcessStartInfo("sc", "stop " + SvrName)
            {
                WindowStyle = ProcessWindowStyle.Hidden,
                UseShellExecute = 独立窗口
            };
            var pro = Process.Start(info);
            pro.WaitForExit();
            Console.WriteLine("卸载 " + SvrName);
            info.Arguments = "delete " + SvrName;
            pro = Process.Start(info);
            pro.WaitForExit();
        }
        private static void Install()
        {
#if DEBUG
            Console.WriteLine("以 DEBUG 模式编译的程序不应安装为 windows 服务。请重新编译程序。");
#else
            Console.WriteLine("创建 " + SvrName);
            //注意这些选项以等号结束,然后要有一个空格,后边才能跟选项值。一定不能缺少空格。
            var info = new ProcessStartInfo("sc", string.Format("create {0} binpath= "{1}" displayname= "{2}" start= auto type= own",
                SvrName, Process.GetCurrentProcess().MainModule.FileName, SvrDisplay))
            {
                WindowStyle = ProcessWindowStyle.Minimized,
                UseShellExecute = false
            };
            var pro = Process.Start(info);
            pro.WaitForExit();
            Console.WriteLine("启动 " + SvrName);
            info.Arguments = "start " + SvrName;
            pro = Process.Start(info);
            pro.WaitForExit();
#endif
        }

10

Execute(); 实际上就是你的执行业务处理的主程序。你的服务中可能就是这样调用它的

    partial class Service : ServiceBase
    {
        public Service()
        {
            InitializeComponent();
        }
        protected override void OnStart(string[] args)
        {
                      ThreadPool.QueueUserWorkItem(h=>  Program.Execute(false));    //自定义参数表示能否是控制台调用
        }
    }

所以,一个控制台程序,它可以用“命令行参数”来控制服务的安装、卸载。并且也可以以控制台方式测试执行。

10

调用执行一个*.bat文件好了,bat文件restart 你的电脑

10

你的所谓“用cmd命令行创建此服务”于这里的
abc.exe -i
命令的区别,你本人一看便知。
这里,abc.exe 把本人安装为服务器,然后立刻启动了服务器!

10

引用:

调用执行一个*.bat文件好了,bat文件restart 你的电脑

呵呵,随时卸载和安装服务,是不用启动电脑的哇。

5

sc create [Name] binpath= "[path]" start= auto

每个=后面有一个空格

5

假如是客户端的exe  直接 用哪个 电脑自带的计划任务就行,然后设置一下

30

通常,在服务器上第一次安装服务,或服务程序改动很大,你需要先用控制台方式运行一下,观察一小会儿(这时候客户端各种程序照常对它测试)。确认它没有抛出 bug、没崩溃,再用 -i 方式安装和启动它。假如直接启动服务,假如它运行时有 bug,你不容易看到。所以其实服务应该这样设计,是最简洁实用的。
另外,我们的服务只有11k字节,会自动到web服务器上自动与本地目录里边的文件进行,假如不一样就下载互联网上的 dll、exe文件,然后重新“热更新”本地插件。每一分钟都去网络上比较一次(比较文件的 md5 即可)。这样的服务可以不停机(不手动操作它)而随时更新里边的全部程序的版本。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明新建了一个windows服务,关机再开机能够自启动,但是用cmd命令行创建此服务需要手动启动
喜欢 (0)
[1034331897@qq.com]
分享 (0)