C#通过WMI的wind32 的API函数实现msinfo32的本地和远程计算机的系统日志查看功能

先不说如何实现,先来看看效果图:

读取远程的需要提供下远程的计算用户名和密码即可。

如何实现这个代码功能,请看如下代码部分:

#region//获取日志文件
       /// <summary>
       /// 获取日志文件       /// </summary>
       /// <param name="topNumber">多少条</param>
       /// <param name="eventCode">事件ID</param>
       /// <param name="startTime">开始时间</param>
       /// <param name="endTime">结束时间</param>
       /// <returns>返回集合</returns>
       public List<EventLogEntity> GetEventLogList(int topNumber, string eventCode, 
           string startTime, string endTime)
       {
           List<EventLogEntity> logList = new List<EventLogEntity>();           try
           {               //条件语句
               StringBuilder query = new StringBuilder();
               StringBuilder strWhere = new StringBuilder();
               query.Append("select EventType, TimeWritten, Category, SourceName, EventIdentifier, RecordNumber,CategoryString,EventCode,Message  from Win32_NTLogEvent ");               //日志ID
               if (!string.IsNullOrEmpty(eventCode))
               {
                   strWhere.Append(" AND eventCode = '");
                   strWhere.Append(eventCode);
                   strWhere.Append("'");
               }               //开始日期
               if (!string.IsNullOrEmpty(startTime))
               {
                   strWhere.Append(" AND TimeWritten>= '");
                   strWhere.Append(getDmtfFromDateTime(startTime));
                   strWhere.Append("'");
               }               //结束日期
               if (!string.IsNullOrEmpty(endTime))
               {
                   strWhere.Append(" AND TimeWritten<= '");
                   strWhere.Append(getDmtfFromDateTime(endTime));
                   strWhere.Append("'");
               }               string laststrWhere = strWhere.ToString();               //如果有检索条件
               if (!string.IsNullOrEmpty(laststrWhere))
               {
                   laststrWhere = " where " + laststrWhere.Substring(4);
               }               //组合条件               query.Append(laststrWhere);               //值
               ManagementObjectCollection moCollection = null;               //如果是本地
               if (isLocal)
               {
                   ManagementScope scope = new ManagementScope(scopePath);
                   scope.Connect();
                   ObjectQuery objectQuery = new ObjectQuery(query.ToString());                   //WQL语句,设定的WMI查询内容和WMI的操作范围,检索WMI对象集合
                   ManagementObjectSearcher Searcher = new ManagementObjectSearcher(scope, objectQuery);                   //异步调用WMI查询
                   moCollection = Searcher.Get();
               }               //表示远程
               else
               {                   //设定通过WMI要查询的内容
                   ObjectQuery Query = new ObjectQuery(query.ToString());                   //WQL语句,设定的WMI查询内容和WMI的操作范围,检索WMI对象集合
                   ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Ms, Query);                   //异步调用WMI查询
                   moCollection = Searcher.Get();
               }               //循环
               if (moCollection != null)
               {                  
                   //计数器
                   int i = 0;                   //foreach
                   foreach (ManagementObject mObject in moCollection)
                   {                       //如果i==topNumber就退出循环
                       if (i == topNumber)
                       {                           break;
                       }
                       EventLogEntity eventLog = new EventLogEntity();                       //日志类型
                       eventLog.EventType = mObject["EventType"] == null ? string.Empty :
                            GetEventTypeString(((NTLogEvent.EventTypeValues)(System.Convert.ToInt32(mObject["EventType"]))));                       //日志种类
                       eventLog.Category = mObject["Category"] == null ? string.Empty :
                            mObject["Category"].ToString();                       //日志种类
                       eventLog.CategoryString = mObject["CategoryString"] == null ? string.Empty :
                            mObject["CategoryString"].ToString();                       //日志编码
                       eventLog.EventCode = mObject["EventCode"] == null ? string.Empty :
                            mObject["EventCode"].ToString();                       //日志ID
                       eventLog.EventIdentifier = mObject["EventIdentifier"] == null ? string.Empty :
                            mObject["EventIdentifier"].ToString();                       //行号
                       eventLog.RecordNumber = mObject["RecordNumber"] == null ? string.Empty :
                            mObject["RecordNumber"].ToString();                       //日期
                       eventLog.TimeWritten = mObject["TimeWritten"] == null ? string.Empty :
                            getDateTimeFromDmtfDate(mObject["TimeWritten"].ToString());                       
                       //日志来源
                       eventLog.SourceName = mObject["SourceName"] == null ? string.Empty :
                            mObject["SourceName"].ToString();                       //详细错误
                       eventLog.Message = mObject["Message"] == null ? string.Empty :
                           mObject["Message"].ToString();                       //add                       logList.Add(eventLog);                       //
                       //                       i++;
                   }

               }
           }           catch (Exception ex)
           {               throw ex;
           }           //           return logList;
       }       #endregion

       #region//根据行号检索错误信息
       /// <summary>
       /// 根据行号检索错误信息       /// </summary>
       /// <param name="recordNumber">行号</param>
       /// <returns>返回错误信息</returns>
       public string GetErrMsg(uint recordNumber)
       {           string Msg = string.Empty;           try
           {               //条件语句
               StringBuilder query = new StringBuilder();
               query.Append("select Message, InsertionStrings from Win32_NTLogEvent where ");
               query.Append(" RecordNumber='");
               query.Append(recordNumber);
               query.Append("'");               //值
               ManagementObjectCollection moCollection = null;               //如果是本地
               if (isLocal)
               {
                   ManagementScope scope = new ManagementScope(scopePath);
                   scope.Connect();
                   ObjectQuery objectQuery = new ObjectQuery(query.ToString());                   //WQL语句,设定的WMI查询内容和WMI的操作范围,检索WMI对象集合
                   ManagementObjectSearcher Searcher = new ManagementObjectSearcher(scope, objectQuery);                   //异步调用WMI查询
                   moCollection = Searcher.Get();
               }               //表示远程
               else
               {                   //设定通过WMI要查询的内容
                   ObjectQuery Query = new ObjectQuery(query.ToString());                   //WQL语句,设定的WMI查询内容和WMI的操作范围,检索WMI对象集合
                   ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Ms, Query);                   //异步调用WMI查询
                   moCollection = Searcher.Get();
               }               //检索错误信息
               foreach (ManagementObject mObject in moCollection)
               {                   //错误信息
                   string message = mObject["Message"] == null ?                       string.Empty : mObject["Message"].ToString();                   //错误信息
                   string[] insertionStrings =mObject["InsertionStrings"]==null?null:
                       (string[])mObject["InsertionStrings"];                   //如果有错误信息
                   if (string.IsNullOrEmpty(message))
                   {                       if (insertionStrings.Length > 0)
                       {
                           StringBuilder sb = new StringBuilder();                           for (int i = 0; i < insertionStrings.Length; i++)
                           {
                               sb.Append(insertionStrings[i]);
                               sb.Append(" ");
                           }

                           Msg =  sb.ToString();
                       }
                      
                   }                   else
                   {
                       Msg= message;
                   }
               }
           }           catch
           {
           }           //return
           return string.IsNullOrEmpty(Msg) ? "无错误信息,请与管理员联系核对!" : Msg;
       }       #endregion

原文发布于微信公众号 - 我为Net狂(dotNetCrazy)

原文发表时间:2016-02-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏菩提树下的杨过

利用fluorineFx将DataTable从.Net传递到Flash

FluorineFx自带的示例都不错,就是有点不简洁,下面的代码基本上已经最简版了(环境vs2010) 1、先创建一个Web Application,然后添加F...

25450
来自专栏技术之路

lock小记

都快把lock忘了用wcf 给手持设备做服务的时候可能会有并发操作但又忘了lock的使用情况 做个小例子,怕自己再忘了 不加lock的时候 结果可能 是负的下面...

20160
来自专栏阿炬.NET

登陆后设置cookie的方法

37070
来自专栏跟着阿笨一起玩NET

ASP.NET通过http/https的POST方式,发送和接受XML文件内容

 本文转载:http://hi.baidu.com/ysyhyt/item/5011ae39ce3cf49fb80c0395

56810
来自专栏张善友的专栏

使用MongoDB的支持Linq 驱动NoRM

MongoDB的驱动有好几个,分布式文件存储的数据库开源项目MongoDB里使用的是github.com/samus/mongodb-csharp,monogo...

228100
来自专栏木宛城主

SharePoint 2013自定义Providers在基于表单的身份验证(Forms-Based-Authentication)中的应用

由于项目的需要,登录SharePoint Application的用户将从一个统一平台中获取,而不是从Domain中获取,所以需要对SharePoint Ap...

24890
来自专栏.NET技术

编写自己的dapper lambda扩展-使用篇

这是针对dapper的一个扩展,支持lambda表达式的写法,链式风格让开发者使用起来更加优雅、直观。现在暂时只有MsSql的扩展,也没有实现事务的写法,将会在...

15220
来自专栏跟着阿笨一起玩NET

如何把已经属于一个DataSet的DataTable加到另一个DataSet中解决方法

28510
来自专栏C#

C#的网络适配器操作

     网络的相关设置在项目开发中有较多的应用,有时候需要在项目中对网络信息进行相关设置。      现在提供提供几种相关的辅助方法类。 (1).IP地址 ...

21970
来自专栏木宛城主

SharePoint 2013 How to Backup Site Collection Automatically With a PowerShell Script

In this post I will introduce a way how to run a script for backing up SharePoin...

25270

扫码关注云+社区

领取腾讯云代金券