绕过 UAC 以允许从非提升源拖放到我们提升的应用程序

Posted

技术标签:

【中文标题】绕过 UAC 以允许从非提升源拖放到我们提升的应用程序【英文标题】:Bypass UAC to allow Drag & Drop from an unelevated source onto our elevated application 【发布时间】:2019-10-07 09:27:58 【问题描述】:

有几个来源解释了防止将文件从资源管理器拖放到提升的应用程序的 UAC 问题,但没有一个涵盖 WPF 示例。

问题是我的应用程序需要以管理员权限运行,但同时它与上面的问题冲突,所以我陷入了僵局。

作为参考,this link 展示了如何使用 ChangeWindowMessageFilter API 在 MFC 应用程序中解决此问题(并非如此)。

是否可以在 WPF 应用程序中实现相同的功能?

- 更新-

我尝试过的事情:

    在创建主窗口句柄后调用ChangeWindowMessageFilter。该函数返回 true。 在创建主窗口句柄后调用ChangeWindowMessageFilterEx,将其作为参数传递。该函数返回 true,CHANGEFILTERSTRUCT.ExtStatusMSGFLTINFO_NONE。 在我的主窗口句柄创建后调用DragAcceptFilesDragQueryFileDragFinish,但是看起来DragAcceptFiles调用不允许在WndProc下拖动事件(WM_DROPFILES),如下:

.

public partial class MainWindow : Window

    protected override void OnSourceInitialized(EventArgs e)
    
        base.OnSourceInitialized(e);

        var source = PresentationSource.FromVisual(this) as HwndSource;

        source.AddHook(WndProc);

        WinAPI.DragAcceptFiles(new WindowInteropHelper(this).Handle, true);
    

    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
    
        if (msg == WinAPI.WM_DROPFILES)
        
            // Not reaching here
        

        return IntPtr.Zero;
    

【问题讨论】:

***.com/questions/8239271/… 无论你使用Win32、MFC、WPF等,解决方法都是一样的——你必须在提升的进程中调用ChangeWindowMessageFilter/Ex(),让它接收来自非提升进程的拖放消息。 @HansPassant 对不起,什么?!你能详细说明你的回复吗?您是说这是不可能的,除非您将清单的 uiAccess 修改为 true(顺便说一句,这并没有解决问题),将我的 EXE 存储到 c:\windows/c:\program files 子目录和/或使用来自有效证书的证书签署我的应用程序代码签名权限?雷米的回答呢? @RemyLebeau 我知道ChangeWindowMessageFilter API 是要走的路。如果这都是一样的,你能告诉我应该在哪里调用ChangeWindowMessageFilter/Ex 吗?在控件的构造函数中?加载事件回调(如果有)?在所有者窗口的构造函数中?等等。顺便说一句,自从 Borland C++ Builder 的好时光以来,你一直在秘密地帮助我 :) 我在您显示的代码中没有看到对ChangeWindowMessageFilterEx() 的调用。你有没有试过把它放在你的OnSourceInitialized() 就在DragAcceptFiles() 的调用上方?顺便说一句,WM_DROPFILES 早已被弃用,你真的应该在窗口上实现IDropTarget 接口。但是你如何用 WPF 做到这一点,我不知道。 【参考方案1】:
"The problem is that my application NEEDS to be run with administrator rights". 

正确。问题是,如果 UI 需要提升权限,则您的应用程序设计得不好。 UI 应始终在标准用户帐户权限下运行。如果您需要提升权限,请使用 Windows 服务。然后使用 IPC 机制在 UI 和服务之间进行通信,例如命名管道。

【讨论】:

以上是关于绕过 UAC 以允许从非提升源拖放到我们提升的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

UAC提升不允许拖放[重复]

如何启用普通和 UAC 提升权限应用程序之间的拖放

如果路径受到保护,请求 Windows Vista UAC 提升?

如何在启动时运行需要 UAC 提升的程序?

vista下开机启动 简单绕过UAC的方法(自己使用runas参数重新启动自己,有点意思)

MSF内网渗透系列2-权限提升