如何编写C#程序检测RDP(mstsc进程)运行状态并发送邮件通知?
检测mstsc进程并触发邮件通知的实现
要实现持续检测RDP客户端(mstsc.exe)是否运行、进程停止时发送邮件告警的功能,重点需要修正进程检测的逻辑漏洞,并加入持续检测机制。以下是完善后的代码实现:
using System.Diagnostics; using System.Net.Mail; using System.Net; using System.Threading; // 邮件配置 var发件人邮箱 = "name@mail.com"; var收件人邮箱 = "name2@mail2.com"; var邮件主题 = "RDP客户端已停止运行告警"; var邮件内容 = "检测到mstsc进程已退出,请及时处理"; // 邮件服务器参数 var邮箱用户名 = "mailserver@mail.com"; // 从邮件服务商获取 var邮箱密码 = "password"; // 从邮件服务商获取 var邮件服务器地址 = "mailserver"; var邮件服务器端口 = 587; // 根据服务商实际端口调整,如465/587 // 初始化SMTP客户端 var smtp客户端 = new SmtpClient(邮件服务器地址, 邮件服务器端口) { Credentials = new NetworkCredential(邮箱用户名, 邮箱密码), EnableSsl = true // 多数服务商要求开启SSL,按需调整 }; // 标记上次检测状态,避免重复发邮件 bool上次检测到进程存在 = true; // 持续检测循环 while (true) { // 获取所有运行中的mstsc进程 Process[] mstsc进程列表 = Process.GetProcessesByName("mstsc"); bool当前进程存在 = mstsc进程列表.Length > 0; // 仅当进程从存在变为不存在时发送告警 if (上次检测到进程存在 && !当前进程存在) { try { smtp客户端.Send(发件人邮箱, 收件人邮箱, 邮件主题, 邮件内容); Console.WriteLine("告警邮件已发送"); } catch (Exception ex) { Console.WriteLine($"发送邮件失败:{ex.Message}"); } } // 更新检测状态 上次检测到进程存在 = 当前进程存在; // 每隔30秒检测一次,可自行调整间隔 Thread.Sleep(30000); }
关键要点说明
- 进程检测逻辑:
Process.GetProcessesByName("mstsc")返回所有运行中的mstsc进程数组,通过判断数组长度是否大于0确定进程状态。原代码直接取processes[0]会在进程不存在时抛出索引越界异常,必须先做长度判断。 - 持续检测机制:用
while(true)实现无限循环,配合Thread.Sleep()控制检测间隔,避免高频检测占用过多CPU资源。 - 避免重复告警:通过状态标记
上次检测到进程存在,仅在进程状态从“存在”变为“不存在”时发送邮件,防止短时间内重复发送大量告警。 - 邮件配置注意:根据你的邮件服务商调整
EnableSsl、端口号等参数,例如QQ邮箱端口为465,Gmail为587,且需开启SSL。
内容的提问来源于stack exchange,提问作者SimK
相关产品推荐
相关产品推荐

