我使用C#创建了自己的家长控制应用来监控我的孩子活动。它以静音方式记录所有键盘输入和屏幕,只有gui的任务栏图标。到目前为止,我只是让它在我的管理员帐户中运行,每个人共享相同的帐户,它工作正常。问题是随着孩子们的成长,他们找到了一种从任务管理器中杀死它的方法。所以,我需要使用更复杂的方法来保护我的应用程序。我想我可以通过为每个孩子创建一个单独的标准帐户来轻松解决这个问题,我可以设置我的应用程序以管理员身份运行以监控他们的所有活动。但是,我遇到了很多问题。
切换到其他用户帐户后,键盘挂钩似乎停止工作。这是真的吗?我认为它是全局性的 - 它是否只是用户帐户中的全局?
屏幕捕获也不适用于其他用户帐户。这是我的代码和
在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);
}
}
非常感谢您的帮助。
答案 0 :(得分: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);
}