C#对电脑登录、锁屏事件进行监听并执行代码

C#对电脑登录、锁屏事件进行监听并执行指定代码

        //引用Microsoft.Win32

        using Microsoft.Win32;

        private void Form1_Load(object sender, EventArgs e)
        {
         //程序加载时执行监听,并最小化程序、隐藏图标。可将程序设为开机自启动
            Microsoft.Win32.SystemEvents.SessionSwitch += new Microsoft.Win32.SessionSwitchEventHandler(SystemEvents_SessionSwitch);
            WindowState = FormWindowState.Minimized;
            ShowInTaskbar = false;
        }

        //监听锁屏、登录事件

        void SystemEvents_SessionSwitch(object sender, Microsoft.Win32.SessionSwitchEventArgs e)
        {
            if (e.Reason == Microsoft.Win32.SessionSwitchReason.SessionLock||e.Reason==Microsoft.Win32.SessionSwitchReason.SessionLogoff)
            {
                // 屏幕锁定  
                //锁屏后执行
                //MessageBox.Show("Screen Lock" + DateTime.Now);
            }
            else if (e.Reason == Microsoft.Win32.SessionSwitchReason.SessionUnlock||e.Reason==Microsoft.Win32.SessionSwitchReason.SessionLogon)
            {
                // 屏幕解锁  
                //解屏、登录后执行

                // MessageBox.Show("Screen Unlock" + DateTime.Now);

            }
        }

 

2024-06-28 16:42:10【出处】:https://blog.csdn.net/qq_33790894/article/details/130239015

=======================================================================================

个人建议以上做出服务开机运行。

=======================================================================================

C#对电脑登录、锁屏事件进行监听

在C#中监听电脑登录和锁屏事件,可通过以下方式实现:


一、核心实现方法

  1. 使用SessionSwitch事件
    通过Microsoft.Win32.SystemEvents.SessionSwitch事件监听系统会话状态变化,包括锁屏、解锁、登录、注销等操作16
    示例代码:

    csharpCopy Code
    using Microsoft.Win32;
    
    // 注册事件
    SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;
    
    private void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
    {
        switch (e.Reason)
        {
            case SessionSwitchReason.SessionLock:
                // 锁屏事件处理
                break;
            case SessionSwitchReason.SessionUnlock:
                // 解锁事件处理
                break;
            case SessionSwitchReason.SessionLogon:
                // 登录事件处理
                break;
            case SessionSwitchReason.SessionLogoff:
                // 注销事件处理
                break;
        }
    }
  2. 资源管理

    • 在程序初始化时注册事件(如窗体加载事件Form_Load1
    • 在程序退出时注销事件,避免内存泄漏6
      csharpCopy Code
      SystemEvents.SessionSwitch -= SystemEvents_SessionSwitch;
      

二、辅助功能实现

  1. 判断当前锁屏状态
    可通过标志位跟踪状态(如_IsSleeping6,或调用系统API检测屏保是否运行7

    csharpCopy Code
    [DllImport("user32.dll")]
    private static extern bool SystemParametersInfo(int uAction, int uParam, ref bool lpvParam, int flags);
    private const int SPI_GETSCREENSAVERRUNNING = 114;
    
    public static bool IsScreenLocked()
    {
        bool isRunning = false;
        SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, ref isRunning, 0);
        return isRunning;
    }

     

  2. 窗体应用程序优化

    • 程序启动时最小化窗体并隐藏托盘图标1
      csharpCopy Code
      WindowState = FormWindowState.Minimized;
      ShowInTaskbar = false; 

三、注意事项

  1. 依赖项

    • 需引用Microsoft.Win32命名空间。
    • 若使用屏保检测API,需添加System.Runtime.InteropServices命名空间7
  2. 兼容性

    • SessionSwitch事件在Windows XP及以上系统有效8
  3. 权限要求

    • 程序需以管理员权限运行,确保能捕获系统级事件。

通过上述方法,可高效监听并响应系统登录、锁屏等事件。完整示例可参考[1][6][8]中的代码实现。

 

出处:BaiDu AI搜索R1满血版

=======================================================================================

使用C#以编程方式检测windows登录尝试

我想开发一个windows窗体应用程序来监视我的网络计算机登录、注销和登录尝试详细信息,并根据检测做一些事情。(例如,向管理员发送一些通知)

我试过的是:

我读过关于使用任务计划程序的windows服务、Windows任务计划程序和事件审核的文章,但我想以务实的方式进行。因此,我的问题是如何使用C#以编程方式检测windows登录尝试?

回答 1

若要检测登录尝试,可以依赖windows安全事件。这里您可以看到安全事件的列表及其含义。您可能感兴趣的常见事件是:

使用应用程序/服务检测事件
您可以通过使用EventLog类并处理其EntryWritten事件的代码检测登录尝试。下面的代码示例只是将事件记录在一个文件中,以显示您可以了解并使用该事件。您可以通过电子邮件发送通知、运行应用程序或做其他事情,而不是在文件中写入。
要测试代码,您应该以管理员身份运行。另外,在实际环境中,您应该让它像服务一样,或者在用户登录之前将其配置为运行。

private void Form1_Load(object sender, EventArgs e)
{
    EventLog logListener = new EventLog("Security");
    logListener.EntryWritten += logListener_EntryWritten;
    logListener.EnableRaisingEvents = true;
}
void logListener_EntryWritten(object sender, EntryWrittenEventArgs e)
{
    //4624: An account was successfully logged on.
    //4625: An account failed to log on.
    //4648: A logon was attempted using explicit credentials.
    //4675: SIDs were filtered.
    var events = new int[] { 4624, 4625, 4648, 4675 };
    if (events.Contains(e.Entry.EventID))
        System.IO.File.AppendAllLines(@"d:\log.txt", new string[] {
            string.Format("{0}:{1}",  e.Entry.EventID, e.Entry.Message)
        });
}

注意:正如您在问题中所说的,可以在事件发生时使用Windows来做一些事情。

当检测到不成功的登录尝试时,您可以要求Windows为您做一些事情,例如运行应用程序(发送电子邮件或其他东西)。为此,请使用Windows任务计划程序,并在发生特定事件时运行该任务,并指定合适的事件源和Id。另外,要查看完整步骤的示例,请参阅通过电子邮件获取事件日志触发器上的事件日志内容

 

出处:https://cloud.tencent.com/developer/ask/sof/113704380

=======================================================================================

c#监听系统用户登录成功和失败

在C#中监听系统用户登录成功和失败的事件通常涉及到Windows事件日志(Event Log)的读取和监听。Windows事件日志记录了系统、安全以及其他组件的事件,包括用户登录的成功和失败。要实现这一功能,你可以使用System.Diagnostics.EventLog类来查询和订阅事件日志。

以下是一些步骤和示例代码,帮助你实现监听系统用户登录成功和失败的功能:

1: 添加必要的命名空间

首先,确保你的C#项目中包含了必要的命名空间:

using System;
using System.Diagnostics;

2: 查询和订阅事件日志

你可以使用EventLog类的EnableRaisingEvents属性来订阅事件。当有新事件写入日志时,OnEntryWritten事件将被触发。

以下是一个示例代码,用于监听安全日志中与登录相关的条目:

class Program
{
    static void Main(string[] args)
    {
        EventLog securityLog = new EventLog();
        securityLog.Log = "Security"; // 安全日志名称
        securityLog.Source = "Microsoft-Windows-Security-Auditing"; // 安全审计提供程序的名称
        securityLog.EnableRaisingEvents = true; // 启用事件监听
 
        // 订阅事件
        securityLog.EntryWritten += new EntryWrittenEventHandler(SecurityLog_EntryWritten);
 
        Console.WriteLine("Press any key to stop listening...");
        Console.ReadKey(); // 等待用户按键停止程序
        securityLog.Dispose(); // 清理资源
    }
 
    private static void SecurityLog_EntryWritten(object sender, EntryWrittenEventArgs e)
    {
        EventLogEntry entry = e.Entry;
        if (entry.InstanceId == 4624 || entry.InstanceId == 4625) // 4624 是登录成功,4625 是登录失败
        {
            Console.WriteLine($"Event ID: {entry.InstanceId}, {entry.Message}");
        }
    }
}
 

解释:

  • Event ID 4624: 表示用户登录成功。

  • Event ID 4625: 表示用户登录失败。

注意:

  • 确保你的应用程序有足够的权限去读取安全日志。通常,这需要管理员权限。

  • 你可能需要在应用程序清单文件中添加对安全日志的访问权限,例如在.csproj文件的<PropertyGroup>中添加:

    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
    <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>

    并在.exe.config中添加:

    <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>

    或者在应用程序的manifest中明确请求这些权限。

通过上述步骤,你可以在C#中监听并处理Windows系统中的用户登录成功和失败事件。

 

关键注意事项‌

  • ‌权限要求‌:程序需以‌管理员权限运行‌,否则无法访问安全日志7。
  • ‌部署方式‌:建议封装为Windows服务或后台进程,确保持续监控7。
  • ‌消息解析‌:事件消息的文本可能因系统语言不同而格式不同,建议通过事件XML结构获取稳定字段7。

3: 扩展功能‌

  • 记录到数据库‌:可将事件信息写入数据库,参考全局变量记录用户ID和时间的逻辑6
  • 实时通知‌:通过邮件或API发送警报,增强监控的实时性7

代码优化建议

  • 使用EventLogReader替代EventLog‌:通过System.Diagnostics.Eventing.Reader命名空间下的类,可更高效解析结构化事件数据,避免文本解析的复杂性。
  • 异步处理‌:在事件处理函数中使用异步方法,避免阻塞主线程7

4: 总结‌

通过上述方法,可实现对Windows系统用户登录行为的实时监控。核心逻辑围绕事件日志的订阅与解析展开,结合权限管理和部署方式优化,确保功能的稳定性和可靠性。

 

提示:AI自动生成,仅供参考

 

出处:

=======================================================================================

posted on 2024-06-28 16:44  jack_Meng  阅读(237)  评论(0)    收藏  举报

导航