禁用提升的Windows程序的GUI功能

时间:2017-11-18 00:56:55

标签: c# windows winforms user-interface windows-10

我希望这样做,以便当我的程序的用户执行某项操作(例如单击程序的WinForm中的按钮)时,Windows屏幕键盘(osk.exe)将启动,但是需要注意的是,我希望屏幕键盘能够通过禁用或删除的标题栏启动 - 例如,禁用“最小化”按钮和“退出/关闭”按钮。

我的问题是,是否有人知道这样做的安全方法。

我的理由是这样的:我希望Windows屏幕键盘在程序的某些部分自动出现,但我们都知道墨菲定律:任何可能出错的东西都会出错。 我不希望用户能够通过键入中途的GUI轻松退出OSK。底层程序本身将知道何时关闭/隐藏osk。

我尝试过搜索类似问题的问题,而我发现的最好的是following,问题没有得到真正解答,但其中一条评论说

  

如果您想避免访问被拒绝错误,则需要提升您的流程。

我知道如何通过之前的C#SO问题禁用GUI的Maximize / Exit / TitleBar / TitleMenu部分(谢谢!)。但问题是当启动过程为“auto-elevated”时。普通用户无法在没有“升级”的情况下编辑GUI。海拔似乎是一个全有或全无的交易;你是管理员,或者你不是。 如果最终用户必须以管理员身份运行,则安全性很差!

所以我恳请一些安全的解决方案:某些方法可以让非管理员用户能够看到并使用没有启用“退出”或“最小化”按钮的屏幕键盘。也许有一种方法可以强制另一个用户(最终用户无权访问)来启动和修改OSK,这样最终用户本身就不必具有特权。或者一种升级最终用户的方法,只是为了获得这一特定进程的许可。 这样的特权真的是全有或全无吗?

其他信息:以下是一些人员链接,解释了如何禁用Windows进程的GUI的某些部分。

  • remove components such as the Menu Bar GUI流程。
  • Run an independent application inside a winforms application。 例如,以下是如何摆脱记事本进程的边框并嵌入到窗体中:     [的DllImport( “USER32.DLL”)]     static extern IntPtr SetParent(IntPtr hWndChild,IntPtr hWndNewParent);

    [DllImport("user32.dll")]
    static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
    
    [DllImport("user32.dll", SetLastError = true)]
    private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);
    
    private const int GWL_STYLE = (-16);
    private const int WS_VISIBLE = 0x10000000;
    private const int WS_MAXIMIZE = 0x01000000;
    
    private static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
    private const UInt32 SWP_NOSIZE = 0x0001;
    private const UInt32 SWP_NOMOVE = 0x0002;
    private const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE;
    
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
    
    
    public Form1()
    {
        InitializeComponent();
    
        Process p = System.Diagnostics.Process.Start("notepad");
    
        p.WaitForInputIdle();
        if (p.MainWindowHandle == null)
        {
            MessageBox.Show(this, "hello", "Error");
        }
        SetParent(p.MainWindowHandle, this.Handle);
        SetWindowLong(p.MainWindowHandle, GWL_STYLE, WS_VISIBLE);
    
        MoveWindow(p.MainWindowHandle, 0, 0, this.Width, this.Height, true);
    }
    

这适用于不需要提升的程序。但是,屏幕键盘或MMC管理单元等程序在尝试在窗口上使用P / Invoke函数(例如SetWindowPos)时会给非管理用户提供Access Denied(5)错误。

0 个答案:

没有答案