gpt4 book ai didi

c# - 调试程序退出后继续发送电子邮件

转载 作者:行者123 更新时间:2023-12-03 07:53:48 25 4
gpt4 key购买 nike

我有以下代码,我将其用作读取一些事件日志的程序的一部分。
今天早上通过代码进行测试后,我不断收到通过电子邮件发送给我的错误消息:

EventLogHelper error occurred in QueryEvents

Exception: The RPC server is unavailable

User:

Client: D7-089


该过程没有在我的机器上运行,我只逐步完成了有问题的方法一两次。然而,消息不断涌现。每条消息之间的时间间隔似乎有所不同,我现在至少收到了 15 条。
这怎么可能?我觉得如果程序正在向我发送电子邮件,它一定是在某个地方执行,但我在 Processes 中看不到它。 Task Manager 中的标签,我尝试结束所有 Visual Studio相关过程没有任何乐趣。

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

主要的()
public static void Main()
{
var eh = new EventLogHelper();
var eventFired = eh.CheckEvents();
}
EventLogHelper.cs
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;
}
构建查询
/// <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;
}
}
查询事件
这是发生错误的地方。我通过这个方法2次 最多当我输入这个问题时,我仍然收到错误电子邮件。
/// <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;
}
}
读取日志
/// <summary>
/// Read the given EventLogReader and return the amount of events that match the IDs we are looking for
/// </summary>
/// <param name="logReader"></param>
/// <returns></returns>
private int ReadLogs(EventLogReader logReader)
{
var count5058 = 0;
var count5061 = 0;
EventRecord entry;

try
{
while ((entry = logReader.ReadEvent()) != null)
{

if (entry.Id == 5058)
{
count5058++;
}
else
{
count5061++;
}
}
}
catch (Exception ex)
{
Email.Send($"EventLogHelper error occurred in ReadLogs \n\n Exception: {ex.Message} \n\n User: {Program.UserName} \n\n Client: {PcName}");
Environment.Exit(Environment.ExitCode);
}

return count5058 + count5061;
}

最佳答案

事实证明,这是由于我的一个愚蠢的错误造成的。

这个程序有一个构建后事件,它被调用:

if $(ConfigurationName) == Release ("$(ProjectDir)PostBuildRelease.bat" "$(TargetDir)" @(VersionNumber) "$(TargetFileName)" "$(TargetName)")

所以它只在 VS 构建配置设置为 Release 时运行.
PostBuildRelease.bat只需将生成的程序集复制到实时位置,以便用户在登录时复制到他们的桌面。
  • 在测试我的应用程序时,我愚蠢地编辑了源代码以查询特定的 PC,然后单步执行代码。
  • 但是,构建配置设置为 Release , 因此,一旦构建了可以调试的程序集,它就会自动复制到实时可执行位置,因此也会在登录时复制到用户的桌面。
  • 如果代码使用硬编码 PcName 运行如果该 PC 不是当前计算机,则事件查询似乎失败并显示上述错误消息。
  • 因此,我收到的所有电子邮件都被发送出去,因为该程序实际上是在用户 PC 上执行的。但是因为 PcName是硬编码的,它看起来总是来自我的程序实例!

  • 这里的教训是始终注意当前选择了哪个构建配置,尤其是在指定了构建后事件的情况下。

    关于c# - 调试程序退出后继续发送电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39635019/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com