我正在尝试使用EventLogQuery类来查询事件日志。我按照http://msdn.microsoft.com/en-us/library/bb671200%28v=vs.90%29.aspx#Y0上显示的示例进行了操作。
我已经搜索过Google了,但是在那里没有硬编码的@SystemTime找不到任何疑问。
有没有人知道我需要使用的DateTime格式?到目前为止我尝试过的所有内容都返回了“无效查询”异常。
答案 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):
答案 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)
答案 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>='{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();