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 に答える