我有以下代码,我将其用作读取某些事件日志的程序的一部分。
今天早上单步执行代码测试后,我不断收到通过电子邮件发送给我的错误消息:
QueryEvents
中发生EventLogHelper错误异常:RPC服务器不可用
用户:
客户:D7-089
这个过程没有在我的机器上运行,我只讨论了一两次问题。但是这些消息不断涌现。每条消息之间的时间间隔似乎有所不同,我现在至少收到了15个。
这怎么可能?我觉得如果程序向我发送电子邮件,它必须在某个地方执行,但我无法在Processes
的{{1}}标签中看到它,我尝试结束所有Task Manager
相关流程任何快乐。
我重新启动了运行VS的PC,但我仍然收到了电子邮件。
Visual Studio
public static void Main()
{
var eh = new EventLogHelper();
var eventFired = eh.CheckEvents();
}
public readonly string PcName;
private readonly int Timespan;
private readonly string Filter;
private static EventLogSession Session;
/// <summary>
/// ctor
/// </summary>
public EventLogHelper()
{
Timespan = 30000; // 30 seconds
PcName = "D7-089"; // This is usually "Environment.MachineName", but specified it here for testing
Filter = $"*[System[(EventID='5061' or EventID='5058') and TimeCreated[timediff(@SystemTime) <= {Timespan}]]]";
}
/// <summary>
/// Checks the event logs for remote pc and returns true if any of the events we are interested in fired
/// </summary>
/// <returns></returns>
public bool CheckEvents()
{
var query = BuildQuery(PcName, Filter);
for (var i = 0; i < 60; i++)
{
var logs = QueryEvents(query);
var events = ReadLogs(logs);
if (events > 0)
{
return true;
}
System.Threading.Thread.Sleep(1000);
}
return false;
}
这是发生错误的地方。我通过这种方法2次最多,当我输入这个问题时,我仍然收到错误的电子邮件。
/// <summary>
/// Builds an EventLogQuery for the given pcname and filter. This should be set up with a user who has admin rights
/// </summary>bh
private static EventLogQuery BuildQuery(string pcName, string filter)
{
try
{
using (var pw = GetPassword())
{
Session = new EventLogSession(
pcName,
"DOMAIN",
"USER",
pw,
SessionAuthentication.Default);
}
return new EventLogQuery("Security", PathType.LogName, filter)
{ Session = Session };
}
catch (Exception ex)
{
Email.Send($"EventLogHelper error occurred in BuildQuery \n\n Exception: {ex.Message} \n\n User: {Program.UserName} \n\n Client: {pcName}");
Environment.Exit(Environment.ExitCode);
return null;
}
}
/// <summary>
/// Execute the given EventLogQuery
/// </summary>
private EventLogReader QueryEvents(EventLogQuery query)
{
try
{
return new EventLogReader(query);
}
catch (Exception ex)
{
Email.Send($"EventLogHelper error occurred in QueryEvents \n\n Exception: {ex.Message} \n\n User: {Program.UserName} \n\n Client: {PcName}");
Environment.Exit(Environment.ExitCode);
return null;
}
}
答案 0 :(得分:1)
事实证明,这是由于我的一个愚蠢错误造成的。
此程序有一个Post-Build事件,调用时为:
if $(ConfigurationName) == Release ("$(ProjectDir)PostBuildRelease.bat" "$(TargetDir)" @(VersionNumber) "$(TargetFileName)" "$(TargetName)")
因此,只有在VS构建配置设置为Release
时才会运行。
PostBuildRelease.bat
只是将结果程序集复制到实时位置,以便用户在登录时复制到他们的桌面。
在测试我的应用程序时,我愚蠢地编辑了源代码以查询特定的PC,然后逐步完成代码。
但是,构建配置设置为Release
,因此,一旦构建了程序集以进行调试,它就会自动复制到实时可执行文件位置,因此也会复制到用户的位置。登录时的桌面。
如果代码是使用硬编码PcName
运行的,其中该PC不是当前计算机,则事件查询似乎失败并显示上述错误消息。
因此,我收到的所有电子邮件都被发送出去,因为该程序实际上是在用户PC上执行的。但是因为PcName
是硬编码的,所以它看起来总是来自我的程序实例!
这里的教训是始终了解当前选择的构建配置,尤其是在指定了Post-Build事件的情况下。