调试程序在退出后保持发送电子邮件

时间:2016-09-22 09:18:55

标签: c# visual-studio debugging events error-handling

我有以下代码,我将其用作读取某些事件日志的程序的一部分。

今天早上单步执行代码测试后,我不断收到通过电子邮件发送给我的错误消息:

  

QueryEvents

中发生EventLogHelper错误      

异常:RPC服务器不可用

     

用户:

     

客户:D7-089

这个过程没有在我的机器上运行,我只讨论了一两次问题。但是这些消息不断涌现。每条消息之间的时间间隔似乎有所不同,我现在至少收到了15个。

这怎么可能?我觉得如果程序向我发送电子邮件,它必须在某个地方执行,但我无法在Processes的{​​{1}}标签中看到它,我尝试结束所有Task Manager相关流程任何快乐。

我重新启动了运行VS的PC,但我仍然收到了电子邮件。

主()

Visual Studio

EventLogHelper.cs

public static void Main()
{
    var eh = new EventLogHelper();
    var eventFired = eh.CheckEvents();
}

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}]]]";
}

BuildQuery对于

/// <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;
}

QueryEvents

这是发生错误的地方。我通过这种方法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;
    }
}

ReadLogs

/// <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;
    }
}

1 个答案:

答案 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事件的情况下。