0

我使用 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);
    }
}   

非常感谢您的帮助。

4

1 回答 1

2

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

例如(已测试):

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);
}
于 2011-04-03T02:17:41.320 回答