C#读取win7和Server2008计划任务(附带读取开机关机时间)

来源:互联网 发布:java获取网络时间 编辑:程序博客网 时间:2024/05/07 05:52
以前负责的项目有个读取服务器计划任务的日志的需求,当时就到C:\Windows\Tasks\SCHEDLGU.TXT读取,根据相应的规律解析出来,放到测试环境上一测(测试机是Server2003),完全正确,发布,然后就发现好多服务器的计划任务信息读不出来,经过调查,没有读出来的都是Server2008的机子。后来在一台Server2008也搭了环境,发现那个文件中压根就没记计划任务的日志,当时调查没有结果,不了了之。离职前没啥任务,看到这功能还没实现,又调查了一下,还是无果,第二天上班在msdn论坛上发了个问题,端午节回来发现有版主回复了,原来这个问题有人用英语提问过一次(英语是硬伤呀,我调查时都是搜的汉语)。经过研究终于解决,特此记录。

在xp和sever2003中,计划任务的日志都是在C:\Windows\Tasks\SCHEDLGU.TXT,(这里C是系统盘),这个还是很容易的,就是读个文本文件而已,注意读取方式和规律即可。而在vista/Server2008、win7以及以上的系统中,计划任务的日志记在C:\Windows\System32\winevt\Logs\Microsoft-Windows-TaskScheduler%4Operational.evtx文件中(其中C是系统盘)。打开事件查看器,如下图:

我们一般读写的都是红框中的windows日志,读写的方式如下:

/// <summary>/// 记录windows日志/// </summary>/// <param name="source">日志来源(自己命名)</param>/// <param name="message">日志内容</param>/// <param name="eventID">事件编号</param>/// <param name="logName">/// 可选项为1."Application"应用程序;2."Security"安全;3."System"系统</param>public static void RecordWindowsLog(string source, string message    , int eventID = 65500, string logName = "Application"){    if (bool.Equals(EventLog.SourceExists(source), false))    {        EventLog.CreateEventSource(source, logName);    }    EventLog.WriteEntry(source, message, EventLogEntryType.Information, eventID);}/// <summary>/// 读取windows日志(这个方法的根据指定的事件编号筛选的,也可用其他参数筛选,自行修改)/// </summary>/// <param name="eventID">事件编号</param>/// <param name="logName">/// 可选项为1."Application"应用程序;2."Security"安全;3."System"系统</param>/// <returns>返回读取到的记录,每行表示一条记录</returns>public static string ReadWindowsLog(int eventID, string logName = "Application"){    EventLog eventlog = new EventLog();    eventlog.Log = logName;    EventLogEntryCollection eventLogEntryCollection = eventlog.Entries;    StringBuilder sb = new StringBuilder();    foreach (EventLogEntry entry in eventLogEntryCollection)    {        //这边可以自行改条件        if (eventID == entry.EventID)        {            sb.AppendFormat("消息:{0};时间:{1};来源:{2};类型:{3};"                , entry.Message                , entry.TimeGenerated.ToString("yyyy-MM-dd HH:mm:ss.fff")                , entry.Source                , entry.EntryType.ToString());            sb.AppendLine();        }    }    return sb.ToString();}

对于下面蓝框中的应用程序和服务日志一直不知道怎么读取,经过msdn论坛上的Mike Feng指点,最终解决,代码如下:

/// <summary>/// 读取其他指定服务的日志(非windows日志)/// </summary>/// <param name="logName">日志名称</param>/// <returns>指定服务的日志</returns>public static string ReadOtherServiceLog(string logName){    EventLogReader eventLogReader = new EventLogReader(logName);    EventRecord eventRecord = eventLogReader.ReadEvent();    StringBuilder sb = new StringBuilder();    while (eventRecord != null)    {        sb.AppendFormat("TaskDisplayName:{0},OpcodeDisplayName:{1},Keywords:{1}"            , eventRecord.TaskDisplayName            , eventRecord.OpcodeDisplayName            , eventRecord.Keywords);        sb.AppendLine();        eventRecord = eventLogReader.ReadEvent();    }    return sb.ToString();}
其中计划任务的日志名称是Microsoft-Windows-TaskScheduler/Operational,这个可以在计划任务的常规界面看到日志名称。如下图:


在研究这个问题时刚好看到一篇关于通过windows日志查看计算机的开关机时间的博客,也一并写了个方法读取出来,代码如下:

/// <summary>/// 读取每天开机关机的时间/// </summary>/// <returns>所有记录的开关机记录</returns>public static string ReadPCOperateTime(){    EventLog eventlog = new EventLog();    //"Application"应用程序, "Security"安全, "System"系统    eventlog.Log = "System";    EventLogEntryCollection eventLogEntryCollection = eventlog.Entries;    StringBuilder sb = new StringBuilder();    foreach (EventLogEntry entry in eventLogEntryCollection)    {        if (entry.EventID == 12)        {            sb.AppendFormat("日期:{0},开机时间为:{1}"                , entry.TimeGenerated.ToLongDateString()                , entry.TimeGenerated.ToLongTimeString());            sb.AppendLine();        }        if (entry.EventID == 13)        {            sb.AppendFormat("日期:{0},关机时间为:{1}"                , entry.TimeGenerated.ToLongDateString()                , entry.TimeGenerated.ToLongTimeString());            sb.AppendLine();        }    }    return sb.ToString();}
源码下载

参考:

1. 如何查看系统历史开关机时间;

2.C#读取win7和Server2008的应用程序和服务日志信息;

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 丽格海棠不爱长怎么办 竹节海棠太高了怎么办 绿萝叶子发黄烂根怎么办 发财树叶子发黄烂根怎么办 君子兰烂根叶子发黄怎么办 四季海棠花叶子干了怎么办 海棠花叶子枯萎枝干发黑怎么办 长寿花叶尖焦了怎么办 新买的盆栽蔫了怎么办 熬中药水太多了怎么办 秋根海棠烂根怎么办 大叶海棠烂根怎么办 玻璃海棠长得很高怎么办 玫瑰海棠叶子干焦怎么办 海棠树树干生虫怎么办 天竺葵花骨朵有虫子了怎么办? 被刺梅的刺扎了怎么办 被刺梅的刺划手了怎么办 虎刺花叶子黄了怎么办 地栽月季叶子发黄怎么办 梅花浇水浇多了怎么办 深水井底下花管进水量小怎么办 盆景对节白腊树叶尖干枯怎么办 四季海棠茎软了怎么办 玫瑰海棠烂根了怎么办 格丽海棠花腌了怎么办 养殖场不能雨污分流怎么办 药店买的药贵了怎么办 神经损伤小便少尿不出来怎么办 手指夹伤出血了怎么办 手指夹破流血了怎么办 喂了宝宝熊胆粉怎么办 不小心擦伤了皮怎么办 吃了减肥药拉肚子怎么办 遇到他心通的人怎么办 被茅山术害了怎么办 鱼缸鱼身上烂了怎么办 鳄鱼龟皮肤烂了怎么办 墨水渗透进皮肤里了怎么办 中药渗透到皮肤里怎么办 甘露醇渗透到皮肤下怎么办