C#读取win7和Server2008计划任务(附带读取开机关机时间)
来源:互联网 发布:java获取网络时间 编辑:程序博客网 时间:2024/05/07 05:52
以前负责的项目有个读取服务器计划任务的日志的需求,当时就到C:\Windows\Tasks\SCHEDLGU.TXT读取,根据相应的规律解析出来,放到测试环境上一测(测试机是Server2003),完全正确,发布,然后就发现好多服务器的计划任务信息读不出来,经过调查,没有读出来的都是Server2008的机子。后来在一台Server2008也搭了环境,发现那个文件中压根就没记计划任务的日志,当时调查没有结果,不了了之。离职前没啥任务,看到这功能还没实现,又调查了一下,还是无果,第二天上班在msdn论坛上发了个问题,端午节回来发现有版主回复了,原来这个问题有人用英语提问过一次(英语是硬伤呀,我调查时都是搜的汉语)。经过研究终于解决,特此记录。
对于下面蓝框中的应用程序和服务日志一直不知道怎么读取,经过msdn论坛上的Mike Feng指点,最终解决,代码如下:
在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的应用程序和服务日志信息;
- C#读取win7和Server2008计划任务(附带读取开机关机时间)
- C#读取注册表,C#创建任务计划
- 如何读取Windows系统事件日志(获得上次关机时间、本次开机时间等)
- win7使用计划任务定时关机
- 开机自启动win7计划任务
- C#读取系统和程序时间
- UE4 c++加密 (附带读取和保存文件)
- Win7的定时关机功能(计划任务+shutdown.exe实现)
- leejianjun的博客 win7使用计划任务定时关机
- 获取系统开机和关机时间
- 计划任务定时关机
- 【ios】读取手机开机时间的方法
- C#读取Excel日期时间
- Win7共享和远程桌面,任务计划
- (转载)C# 读取配置文件和修改
- 如何查看电脑关机和开机的时间
- 【Win XP】查看XP系统开机和关机时间
- Linux计划任务读取mysq并发送邮件
- C#学习笔记(1)
- ORA-02069: global_names parameter must be set to TRUE for this operation
- JAVA多线程与并发学习总结(转)
- 黑马程序员_二、java基础语法(常量、变量、进制及运算符)
- LitJsonTest
- C#读取win7和Server2008计划任务(附带读取开机关机时间)
- VMware, ... eth0....failed - no link present check cable解决方法
- Linux学习-dev命令
- Android中的异步操作(多线程)
- get 、post、request详解
- Spring @ResponseBody 返回乱码 的优雅解决办法
- 通过Egit将项目推送至GitHub上(SSH方式)
- ubuntu下安装matlab时遇到Permission denied问题的解决方案
- 三处乱码问题