Перехват клавиатуры WIN7 перестает работать в другой учетной записи пользователя? - PullRequest
0 голосов
/ 03 апреля 2011

Я создал свое собственное приложение для родительского контроля, используя C # для мониторинга активности моих детей.Он записывает весь ввод с клавиатуры и экраны в фоновом режиме, с единственным графическим изображением на панели задач.До сих пор я просто позволил этому запускаться в моей учетной записи администратора, и все разделяют ту же учетную запись, и она отлично работает.Проблема в том, что, когда дети растут, они нашли способ убить его из диспетчера задач.Итак, мне нужно использовать более изощренный способ защиты моего приложения.Я думал, что смогу легко решить эту проблему, создав отдельную стандартную учетную запись для каждого ребенка, и я могу настроить свое приложение для запуска в качестве администратора для отслеживания всех их действий.Однако я столкнулся с множеством проблем.

  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);
    }
}   

Ваша помощь очень ценится.

1 Ответ

2 голосов
/ 03 апреля 2011

Пока дети не являются администраторами, вы можете запускать программу под своими учетными записями и запретить доступ к процессу.

Например (проверено):

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...