【问题标题】:C# SessionSwitchReason.SessionLock NOT triggering when machine is locked via Group Policy当机器通过组策略锁定时,C# SessionSwitchReason.SessionLock 不会触发
【发布时间】:2026-01-04 13:15:02
【问题描述】:

编辑:这里的问题不是它被 GP 锁定的事实,而是它在服务帐户下作为服务运行,并且无法访问交互式桌面

我有一个 C# 应用程序需要检查用户的会话何时被锁定,我使用的是Microsoft.Win32.SystemEvents.SessionSwitch,当用户手动锁定机器时它可以正常工作。

问题在于,当机器通过组策略(用户配置 > 策略 > 管理模板 > 个性化 > 屏幕保护程序超时)锁定时,应用程序不会启动开关。

还有其他方法可以检查机器是否被锁定?还是有其他方法可以通过应用程序获取的组策略锁定机器?

注意该应用程序作为具有完全管理员权限的服务在 Windows 7 上运行

这是我的代码,提前谢谢!!! :)

     public void OnStart(string[] args)
            {

            Microsoft.Win32.SystemEvents.SessionSwitch += new Microsoft.Win32.SessionSwitchEventHandler(SystemEvents_SessionSwitch);
            }


    void SystemEvents_SessionSwitch(object sender, Microsoft.Win32.SessionSwitchEventArgs e)
           {

            if (e.Reason == SessionSwitchReason.SessionLock)
                  {
                   //DO STUFF
                  }
           }

【问题讨论】:

  • 目前正在寻找一种解决方案,该解决方案涉及在 Windows 事件查看器中启用其他登录/注销事件,这将记录工作站锁定和解锁,然后轮询以了解用户何时锁定/解锁他们的工作站

标签: c# switch-statement locking screensaver group-policy


【解决方案1】:

我设法通过在 Windows 事件查看器中启用“其他登录/注销事件”并搜索锁定和解锁事件来解决此问题。

    //Define strings for searching the eventlog.
    string lockEvent = "4800";
    string unlockEvent = "4801";

     //Define the Eventlog source you want (in this case it's Security)
    string LogSource = @"Security";

    //Add these together to make the full query for Lock and Unlock
    string LockQuery = " *[System/EventID=" + lockEvent + "]";
    string UnlockQuery = "*[System/EventID=" + unlockEvent + "]";


//Return true if there is any locked events found.

    private bool CheckForLock()
    {
        //Create Eventlog Reader and Query
        var elQuery = new EventLogQuery(LogSource, PathType.LogName, LockQuery);
        var elReader = new System.Diagnostics.Eventing.Reader.EventLogReader(elQuery);

        //Create a list of Eventlog records and add the found records to this
        List<EventRecord> eventList = new List<EventRecord>();
                for (EventRecord eventInstance = elReader.ReadEvent();
                    null != eventInstance; eventInstance = elReader.ReadEvent())
                {

                   eventlist.add(eventInstance);

                 }

          if(eventList.count > 0)
              {
                  return true;
              }
           else
             { 
                 return false;
             }

        }

注意这将检查所有事件日志,因此您需要对您希望蜜蜂查找的过去多远进行限定。 如果您每十秒检查一次锁定/解锁会话,您只想处理来自同一时间段的EventRecord。 您可以访问 eventlist.TimeCreated 值来执行类似...

        if (eventInstance.TimeCreated > DateTime.Now - TimeSpan.FromSeconds(10))
        {
            eventList.Add(eventInstance);

        }

优雅吗?不,它有效吗?是的。

【讨论】:

    最近更新 更多