Windows 以编程方式检测远程会话中是否存在日志

Windows 以编程方式检测远程会话中是否存在日志,windows,windows-8,logmein,Windows,Windows 8,Logmein,是否有方法通过编程检测当前Windows PC/用户上是否存在LogMeIn会话 我尝试过几种方法(用C#,但语言与此无关): 使用CPU性能计数器,假设LogMeInRC.exe在会话中的CPU使用率明显较高。这种方法能够检测某些会话,但错误率太高 通过监视LogMeIn的性能计数器IO写入字节/s或IO数据字节/s。这只在最初起作用。如果会话时间超过一分钟,这些性能计数器不会记录任何活动,即使LogMeIn仍有网络流量 有任何提示吗?通过拦截ETW跟踪解决了此问题: var logmei

是否有方法通过编程检测当前Windows PC/用户上是否存在LogMeIn会话

我尝试过几种方法(用C#,但语言与此无关):

  • 使用CPU性能计数器,假设LogMeInRC.exe在会话中的CPU使用率明显较高。这种方法能够检测某些会话,但错误率太高
  • 通过监视LogMeIn的性能计数器
    IO写入字节/s
    IO数据字节/s
    。这只在最初起作用。如果会话时间超过一分钟,这些性能计数器不会记录任何活动,即使LogMeIn仍有网络流量

有任何提示吗?

通过拦截ETW跟踪解决了此问题:

var logmeinProcess = System.Diagnostics.Process.GetProcessesByName("LogMeIn").Single();
using (var session = new TraceEventSession("MyRealTimeSession"))         // Create a session to listen for events
{
    session.EnableKernelProvider(Microsoft.Diagnostics.Tracing.Parsers.KernelTraceEventParser.Keywords.NetworkTCPIP);
    session.Source.Kernel.UdpIpSend += (data) =>
    {
        if (data.ProcessID == logmeinProcess.Id)
        {
            lock (_logMeInUdpQueue)
            {
                _logMeInUdpQueue.Enqueue(DateTime.UtcNow);
            }
        }
    };

    session.Source.Process();
}

通过这种方式,我可以获得LogMeIn进程发送的UDP数,这非常适合检测LogMeIn会话。

为什么不检查登录的用户?对此有很多答案,例如,同一个用户登录,无论该用户是坐在电脑前还是在进行LogMeIn会话。这是不正确的。用户名可能相同,会话/配置文件可能不同。操作系统知道会话是本地的还是远程的,以及会话是如何建立的。这是您通过切换到任务管理器的用户选项卡获得的信息。您可以使用WMI、P/Invoke或System获得相同的信息。管理类我刚刚在Task Manager的“用户”选项卡上检查过:这里列出了相同且唯一的用户,无论我是在电脑前面还是在LogMeIn会话中。相反,请使用do session.EnableProvider(新Guid({DBE9B383-7CF3-4331-91CC-A3CB16A3B538}));此GUID标识为Microsoft Windows登录,您可以使用PerfView查看所关心的确切事件id。