Windows 7 WIN7键盘挂钩在另一个用户帐户中停止工作?

Windows 7 WIN7键盘挂钩在另一个用户帐户中停止工作?,windows-7,user-accounts,keyboard-hook,Windows 7,User Accounts,Keyboard Hook,我用C#创建了自己的家长控制应用程序来监控我孩子的活动。它在后台以静默方式记录所有键盘输入和屏幕,只有任务栏图标的gui。到目前为止,我只是让它运行在我的管理员帐户和每个人共享同一个帐户,它的工作良好。问题是,随着孩子们的成长,他们找到了一种从任务管理器中消除它的方法。因此,我需要使用更复杂的方法来保护我的应用程序。我想我可以通过为每个孩子创建一个单独的标准帐户来轻松解决这个问题,我可以将我的应用程序设置为以管理员身份运行,以监控他们的所有活动。然而,我面临着很多问题 一旦我切换到另一个用户帐户

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

  • 一旦我切换到另一个用户帐户,键盘挂钩似乎就停止工作了。这是真的吗?我认为它是全局钩子-它只是用户帐户中的全局钩子吗

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

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


    非常感谢您的帮助。

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

    例如(已测试):


    不过,这与其说是与某一特定群体有关,不如说是与特权有关。我相信这正是我想要的。但是你能不能再详细说明一下如何使用它?谁将调用SetAcl()?在您的程序中调用,并在我的受限用户+1下运行。另外,确保没有任何窗口可以接受来自其他进程的消息。windows上没有ACL,这就是为什么这可能是一个漏洞的原因。我只是尝试了一下。在安装程序中,有一个选项“Windows启动时自动启动”>“适用于所有用户”。使用此选项安装后,程序会在重新启动后自动启动。但是,在标准用户帐户中,此程序在任务管理器中显示为我的“管理员”用户。我想,正因为如此,我找不到这个应用程序的任务栏图标,而且这个应用程序似乎也不工作。我如何克服这个限制?我想从我的管理员帐户安装一次,并使其对所有帐户运行。可能吗?怎么做?你碰到了Windows 7的新功能。消息筛选器和完整性级别。但是,我的问题是,如何运行应用程序?在他们的帐户内在管理员帐户内?在什么桌面上?它只能在同一个桌面上工作。您是否修复了桌面和窗口站ACL以授予对程序运行时使用的凭据的访问权限?实际上,我尝试了不同的方法来运行程序(例如,从Windows服务或通过计划任务),但无法使其工作。我不熟悉你提到的Win7的新功能。对于我的测试,我只是从我的管理员帐户启动程序,然后切换到孩子的帐户作为标准用户。这不会起作用。服务也将不起作用(由于会话分离限制,关于Vista)。您必须在与要监视的帐户外壳相同的桌面/winsta中运行该进程。
    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);
        }
    }   
    
    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);
    }