• Daemon Monitor Windows Services Status


    
    namespace Microshaoft
    {
        using System;
        using System.Timers;
        using System.Management;
        using System.ServiceProcess;
        using System.Diagnostics;
        using System.ComponentModel;
        using System.Collections.Generic;
        using System.Security.Principal;
        using System.Configuration.Install;
        using Microshaoft;
        public class SimpleService : ServiceBase //继承于 ServiceBase
        {
            public const string serviceName = "ServicesDaemon";
            private Timer _timer;
            public static void Main(string[] args)
            {
                SimpleService x = new SimpleService();
                int l = 0;
                if (args != null)
                {
                    l = args.Length;
                }
                if (l > 0) //有参数时以 console 方式运行
                {
                    Console.Title = "serviceName";
                    Console.WriteLine("Run as Console");
                    x.OnStart(null);
                    Console.ReadLine();
                }
                else
                //intallutil 成服务后
                //即: 无参数时,以 Service 方式运行
                {
                    Console.WriteLine("Run as Service");
                    ServiceBase.Run(x);
                }
            }
            public SimpleService()
            {
                CanPauseAndContinue = true;
                ServiceName = SimpleService.serviceName;
            }
            protected override void OnStart(string[] args)
            {
                Console.WriteLine(".Net Version: {0}", Environment.Version.ToString());
                Console.WriteLine("Current Identity: {0}", WindowsIdentity.GetCurrent().Name);
                Console.WriteLine("{0} started,at {1}", SimpleService.serviceName, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ss"));
                _timer = new Timer();
                _timer.Interval = 60 * 1000;
                _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);
                _timer.Start();
                _timer_Elapsed(null, null);
                //在这里写你的程序
            }
            void _timer_Elapsed(object sender, ElapsedEventArgs e)
            {
                _timer.Stop();
                try
                {
                    Process();
                }
                catch
                {
                }
                finally
                {
                    _timer.Start();
                }
            }
            private void Process()
            {
                ManagementObjectSearcher searcher = new ManagementObjectSearcher
                                                                    (
                                                                        "root\\CIMV2",
                                                                        "SELECT * FROM Win32_Service where name like 'hello%'"
                                                                    );
                ManagementObjectCollection moc = searcher.Get();
                foreach (ManagementObject mo in moc)
                {
                    string logMessage;
                    string service = null;
                    try
                    {
                        service = mo["Name"].ToString();
                        if (mo["State"].ToString().ToLower() != "running")
                        {
                            logMessage = string.Format
                                                    (
                                                        "主机[{0}],[{1}],[{2}] 服务于[{3}]没有运行"
                                                        , Environment.MachineName
                                                        , service
                                                        , mo["StartMode"].ToString()
                                                        , DateTime.Now
                                                     );
                            EventLogHelper.WriteEventLogEntry
                                                (
                                                    this.ServiceName + " log",
                                                    service + " source",
                                                    logMessage,
                                                    EventLogEntryType.Error
                                                );
                            if (mo["StartMode"].ToString().ToLower() == "auto")
                            {
                                ServiceController controller = new ServiceController(service);
                                if (controller.Status != ServiceControllerStatus.Running)
                                {
                                    controller.Start();
                                }
                                logMessage = string.Format
                                                        (
                                                            "主机[{0}],[{1}],[{2}] 服务于[{3}]成功重新启动"
                                                            , Environment.MachineName
                                                            , service
                                                            , mo["StartMode"].ToString()
                                                            , DateTime.Now
                                                        );
                                EventLogHelper.WriteEventLogEntry
                                                    (
                                                        this.ServiceName + " log",
                                                        service + " source",
                                                        logMessage,
                                                        EventLogEntryType.Information
                                                    );
                            }
                        }
                    }
                    catch (ManagementException me)
                    {
                        logMessage = string.Format
                                                (
                                                    "主机[{0}],[{1}],[{2}] 服务查询发生[{3}]异常[{4}],于[{5}]"
                                                    , Environment.MachineName
                                                    , service
                                                    , mo["StartMode"].ToString()
                                                    , "ManagementException"
                                                    , me.ToString()
                                                    , DateTime.Now
                                                );
                        EventLogHelper.WriteEventLogEntry
                                                (
                                                    this.ServiceName + " log",
                                                    service + " source",
                                                    logMessage,
                                                    EventLogEntryType.Error
                                                );
                    }
                    catch (Exception e)
                    {
                        logMessage = string.Format
                                                (
                                                    "主机[{0}],[{1}],[{2}] 服务查询发生[{3}]异常[{4}],于[{5}]"
                                                    , Environment.MachineName
                                                    , service
                                                    , mo["StartMode"].ToString()
                                                    , "Exception"
                                                    , e.ToString()
                                                    , DateTime.Now
                                                );
                        EventLogHelper.WriteEventLogEntry
                                                (
                                                    this.ServiceName + " log",
                                                    service + " source",
                                                    logMessage, EventLogEntryType.Error
                                                );
                    }
                }
            }
        }
        //以下就是比普通应用程序多出的 ProjectInstaller
        [RunInstallerAttribute(true)]
        public class ProjectInstaller : Installer
        {
            private ServiceInstaller serviceInstaller;
            private ServiceProcessInstaller processInstaller;
            public ProjectInstaller()
            {
                processInstaller = new ServiceProcessInstaller();
                serviceInstaller = new ServiceInstaller();
                // Service will run under system account
                processInstaller.Account = ServiceAccount.LocalSystem;
                // Service will have Start Type of Manual
                serviceInstaller.StartType = ServiceStartMode.Manual;
                serviceInstaller.ServiceName = SimpleService.serviceName;
                Installers.Add(serviceInstaller);
                Installers.Add(processInstaller);
            }
        }
    }
    namespace Microshaoft
    {
        using System;
        using System.Diagnostics;
        class EventLogHelper
        {
            public static void WriteEventLogEntry
                                            (
                                                string logName,
                                                string sourceName,
                                                string logMessage,
                                                EventLogEntryType logEntryType
                                            )
            {
                if (!EventLog.SourceExists(sourceName))
                {
                    EventLog.CreateEventSource(sourceName, logName);
                }
                EventLog log = new EventLog();
                log.Source = sourceName;
                log.WriteEntry(logMessage, logEntryType);
            }
        }
    }
    
    
  • 相关阅读:
    PHP环境搭建-修改密码
    先挖个坑....
    usaco 1.2.1(指针技巧)
    warfare(最大生成树裸题)
    最大生成树(最小生成树同理)
    快排
    简单邻接表代码实现
    并查集模板题
    并查集
    get 新技能
  • 原文地址:https://www.cnblogs.com/Microshaoft/p/1562332.html
Copyright © 2020-2023  润新知