【问题标题】:Detect programmatically if there is a LogMeIn remote session以编程方式检测是否存在 LogMeIn 远程会话
【发布时间】:2014-05-27 16:56:48
【问题描述】:

有没有办法以编程方式检测当前 Windows PC/用户上是否存在 LogMeIn 会话?

我已经尝试了几种方法(在 C# 中,但语言无关紧要):

  • 使用 CPU 性能计数器,假设 LogMeInRC.exe 的 CPU 使用率在会话期间明显更高。这种方法可以检测到一些会话,但是错误率太高了。
  • 通过监视 LogMeIn 的性能计数器 IO Write Bytes/sIO Data Bytes/s。这仅在最初有效。如果会话超过一分钟,这些性能计数器不会记录任何活动,即使 LogMeIn 仍有网络流量。

有什么提示吗?

【问题讨论】:

  • 你为什么不只检查登录用户?对此有很多答案,例如stackoverflow.com/questions/22609200/…
  • 同一用户登录,无论用户是坐在 PC 前还是在 LogMeIn 会话中。
  • 这是不正确的。用户名可能相同,会话/配置文件将不同。操作系统知道会话是本地的还是远程的以及它是如何建立的。这是您通过切换到任务管理器的用户选项卡获得的信息。您可以使用 WMI、P/Invoke 或 System.Management 类获得相同的信息
  • 我刚刚检查了任务管理器的用户选项卡:无论我是在 PC 前还是在 LogMeIn 会话中,都列出了相同且唯一的用户。

标签: windows windows-8 logmein


【解决方案1】:

通过拦截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 会话。

【讨论】:

  • 改为 session.EnableProvider(new Guid("{DBE9B383-7CF3-4331-91CC-A3CB16A3B538}"); 这个 GUID 被标识为 Microsoft-Windows-Logon 可以使用 PerfView 查看您关心的确切事件 ID。
猜你喜欢
  • 2010-11-05
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多