期望EventLogQuery时间格式?

时间:2011-12-19 20:48:34

标签: .net

我正在尝试使用EventLogQuery类来查询事件日志。我按照http://msdn.microsoft.com/en-us/library/bb671200%28v=vs.90%29.aspx#Y0上显示的示例进行了操作。

我已经搜索过Google了,但是在那里没有硬编码的@SystemTime找不到任何疑问。

有没有人知道我需要使用的DateTime格式?到目前为止我尝试过的所有内容都返回了“无效查询”异常。

5 个答案:

答案 0 :(得分:15)

EventLogQuery使用XML格式查询事件日志。 您可以找到查询XML here的架构。

Select element的文本是针对事件的XML序列化评估的XPath表达式。

您可以找到事件XML here的架构。

TimeCreated element的属性SystemTime类型为dateTime,因此格式(在您的查询XML中)是XPath处理器可以解析的有效日期时间(请参阅3.2.7.1. Lexical representation具体而言。)

例如,您可以尝试这样的查询:

<QueryList>
  <Query Id="0" Path="Application">
    <Select Path="Application">*[System[TimeCreated[@SystemTime = '2011-12-20T00:42:53.000000000Z']]]</Select>
  </Query>
</QueryList>

如果恰好在给定的日期和时间创建了一个事件,则会解析并返回一个值。

同样dateDiff是Filter XPath协议的扩展函数,它接受SYSTEMTIME类型的一个或两个参数并返回一个数字,所以只需在表达式中使用此函数的数字(就像在你的例子中。)


P.S。您可以使用Windows事件查看器(%windir%\system32\eventvwr.msc)输入并快速评估creating Custom Views的事件查询XML(仅限Windows Vista,7和2008):

enter image description here

答案 1 :(得分:4)

这是另一个用于初始化EventLogQuery对象的C#,它将加载特定日期范围的事件entires

{
  "body" : $input.json('$'),
  "headers": {
    #foreach($param in $input.params().header.keySet())
    "$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end

    #end  
  },
  "stage" : "$context.stage"
}

答案 2 :(得分:2)

这是一个C#示例,用于初始化EventLogQuery对象,该对象仅从最后一天加载事件条目。

var yesterday = DateTime.UtcNow.AddDays(-1);

var yesterdayDtFormatStr = yesterday.ToString(
   "yyyy-MM-ddTHH:mm:ss.fffffff00K", 
   CultureInfo.InvariantCulture
);

var query = string.Format(
   "*[System/TimeCreated/@SystemTime >='{0}']", 
   yesterdayDtFormatStr
);

var elq = new EventLogQuery("Application", PathType.LogName, query);

答案 3 :(得分:0)

Event XML

此处有一个XML示例,其中包含预期日期格式的字符串版本。

<TimeCreated SystemTime="2006-02-28T21:51:44.754Z" />

答案 4 :(得分:0)

最近2小时内失败的登录IP列表。 EventID = 4625 AND CreatedDate> =最近2小时

var AfterTime = DateTime.Now.AddMinutes(-120);

string queryString =
                    "<QueryList>" +
                    "  <Query Id='0' Path='Security'>" +
                    $"    <Select Path='Security'>*[System[(EventID=4625) and TimeCreated[@SystemTime&gt;='{AfterTime.ToString("o")}']]]</Select>" +
                    "  </Query>" +
                    "</QueryList>";  

var reader = new EventLogReader(new EventLogQuery("Security", PathType.LogName, queryString));

for (EventRecord eventDetail = reader.ReadEvent(); eventDetail != null; eventDetail = reader.ReadEvent())
{
    if (eventDetail.Id == 4625 && eventDetail.TimeCreated >= AfterTime)// Extra security, check again
    {
                    IPlist.Add(eventDetail.Properties[eventDetail.Properties.Count - 2].Value.ToString()); // Get IP Adress, Last Second Element Has IP Adress
    }

}

var AttackerIP = IPlist.GroupBy(x => x).Select(x => x.Key).ToList();