【问题标题】:WIN7 Keyboard hook stops working in another user account?WIN7 键盘挂钩在另一个用户帐户中停止工作?
【发布时间】:2011-04-03 02:11:51
【问题描述】:

我使用 C# 创建了自己的家长控制应用程序来监控我孩子的活动。它在后台静默记录所有键盘输入和屏幕,只有任务栏图标的 gui。到目前为止,我只是让它在我的管理员帐户中运行,并且每个人都共享同一个帐户并且它工作正常。问题是,随着孩子们长大,他们找到了一种从任务管理器中杀死它的方法。所以,我需要使用更复杂的方式来保护我的应用程序。我想我可以通过为每个孩子创建一个单独的标准帐户来轻松解决这个问题,并且我可以设置我的应用程序以管理员身份运行以监控他们的所有活动。但是,我遇到了很多问题。

  1. 切换到其他用户帐户后,键盘挂钩似乎停止工作。这是真的吗?我认为这是全局挂钩 - 它只是用户帐户中的全局吗?

  2. 屏幕捕获在另一个用户帐户上也不起作用。这是我的代码和

它在 g.CopyFromScreen 失败,错误为“句柄无效”:

RECT rc = Win32.GetWindowRect();
using (System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(rc.Width, rc.Height))
{
    using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap))
    {
        g.CopyFromScreen(rc.Location, System.Drawing.Point.Empty, new System.Drawing.Size(rc.Width, rc.Height));
        string fileName = Settings.Instance.GetImageFileName();
        bitmap.Save(fileName, System.Drawing.Imaging.ImageFormat.Png);
    }
}   

非常感谢您的帮助。

【问题讨论】:

  • 您已经接触到了 Windows 7 的新功能。消息过滤器和完整性级别。不过,我的问题是,您如何运行该应用程序?在他们的帐户中的管理员帐户中?在什么桌面上?它只能在同一个桌面上工作。您是否修复了桌面和窗口站 ACL 以授予对运行程序的凭据的访问权限?
  • 实际上,我尝试了不同的方式来运行程序(例如,从 Windows 服务,或通过计划任务),但无法让它工作。我不熟悉你提到的Win7的新功能。对于我的测试,我只是从我的管理员帐户启动程序,然后以标准用户身份切换到孩子的帐户。
  • 那行不通。服务也将不起作用(由于会话分离限制,关于 Vista)。您必须在与您要监控的帐户的 shell 相同的桌面/winsta 中运行该进程。

标签: windows-7 user-accounts keyboard-hook


【解决方案1】:

只要孩子不是管理员,您就可以在他们的帐户下运行程序并拒绝访问该进程。

例如(已测试):

static void SetAcl() {
    var sd = new RawSecurityDescriptor(ControlFlags.None,
        new SecurityIdentifier(WellKnownSidType.LocalSystemSid, null),
        null, null, new RawAcl(2, 0));

    sd.SetFlags(ControlFlags.DiscretionaryAclPresent | ControlFlags.DiscretionaryAclDefaulted);
    var rawSd = new byte[sd.BinaryLength];

    sd.GetBinaryForm(rawSd, 0);
    if (!NativeMethods.SetKernelObjectSecurity(Process.GetCurrentProcess().Handle, SecurityInfos.DiscretionaryAcl, rawSd))
        throw new Win32Exception();
}

static class NativeMethods {
    [DllImport("Advapi32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool SetKernelObjectSecurity(IntPtr target, SecurityInfos info, byte[] descriptor);
}

【讨论】:

  • 不过,它与特定组的关系不大,而是与特权相关。
  • 嗨 Slaks:谢谢一百万。这正是我想要的,我相信。但是您能否详细说明如何使用它?谁会调用 SetAcl()?
  • 在你的程序中调用,并在受限用户下运行。
  • +1 来自我。另外,请确保您没有任何可以接受来自其他进程的消息的窗口。 Windows 上没有 ACL,这就是为什么这可能是一个漏洞的原因。
  • 我刚试过。在安装程序中,有一个选项“Windows 启动时自动启动”>“对于所有用户”。使用此选项安装后,程序会在重新启动后自动启动。但是,在标准用户帐户中,该程序在任务管理器中显示为我的“管理员”用户。我想,正因为如此,我找不到这个应用程序的任务栏图标,而且这个应用程序似乎也没有工作。如何解决此限制?我想从我的管理员帐户安装一次并让它为所有帐户运行。是否可以?怎么样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
  • 2012-08-27
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
相关资源
最近更新 更多