如何在 Windows 中监视用户(in-)活动?

Posted

技术标签:

【中文标题】如何在 Windows 中监视用户(in-)活动?【英文标题】:How to monitor user (in-)activity in Windows? 【发布时间】:2010-12-28 15:15:20 【问题描述】:

以编程方式检查特定 Windows 机器当前是否正在被人类使用的最简单方法是什么?

我正在考虑为我们相当有限的互联网连接编写一个“礼貌监视器”——基本上是一种随时查看当前谁在积极使用互联网的方法,因此当有人需要下载大文件时,他们可以尽量减少对他人的烦恼(并将这些统计数据保留在历史上,以便人们可以预测上行链路何时不会太滞后)。我正在尝试收集多个证据来源,然后可以使用这些证据来推断活动。

对于 Windows 用户来说,能够查看他们是否在打字或移动鼠标,或其他一些等效的活动度量是非常有用的。我已经考虑过使用System.Diagnostics.Process 类来查看某些进程是否正在运行(在线游戏和其他占用大量带宽的应用程序)以及它们何时启动。我认为如果在过去半小时内启动了一堆常见的用户进程(firefox、iTunes 等),那么可以合理地打赌,椅子上坐着一个肉袋在做某事。一旦我检测到活动,我会向服务器发送一个微小的 HTTP POST 请求(说“嘿,我还活着,正在做某事!”),并且在我的 Linux 机器上运行的 web 应用程序会更新以显示用户处于活动状态。

我考虑过使用 IM 状态,但不同的 IM 客户端似乎具有不同级别的操作系统集成 - 人们似乎并没有尽可能多地更新这些状态。像所有优秀的 Web 2.0 公民一样,我当然也在使用 Twitter。 ;)

免责声明:我是一个避免使用 Windows 的 UNIX 和 Mac 用户。我在 Mono 中摆弄过 .NET,但之前从未接触过 Win32 API。温柔点。

【问题讨论】:

您有终端服务器许可证吗? 如何检查屏幕保护程序是否正在运行? 没有。我们主要是 Linux 或 OS X 用户,但也有少数人在他们的机器上使用 Windows (XP/Vista/7)。 我想过检查屏幕保护程序,但并不是每个人都有屏幕保护程序——至少有一个人在离开房间时只是按下了屏幕关闭按钮。 【参考方案1】:

你可能想看看GetLastInputInfo

GetLastInputInfo 函数检索最后一个输入事件的时间。

这是一个您可以通过interop 调用的 Windows API 函数:

[DllImport("user32.dll")]
static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);

[StructLayout( LayoutKind.Sequential )]
struct LASTINPUTINFO

    public static readonly int SizeOf = Marshal.SizeOf(typeof(LASTINPUTINFO));

    [MarshalAs(UnmanagedType.U4)]
    public int cbSize;    
    [MarshalAs(UnmanagedType.U4)]
    public UInt32 dwTime;

编辑:呃,你没有在问题中指定你使用什么语言,我只是假设基于.Net,因为你引用了System.Diagonstics.Process

【讨论】:

谢谢。 C# 或 C# 和 IronRuby 的混合。

以上是关于如何在 Windows 中监视用户(in-)活动?的主要内容,如果未能解决你的问题,请参考以下文章

Sql Server 活动监视器中的这个过程是啥?

Bro-Sysmon:一款让Bro-IDS(Bro)监视Windows端点活动的工具

Azure Data Studio - 如何访问活动监视器

您如何决定在 SQL Server 活动监视器中终止哪个进程?

我如何监视用户对AWS S3的访问?

如何确定我的 .NET Windows Forms 程序在哪个监视器上运行?