• 用非管理员权限启动主程序,并用管理员权限启动子程序,导致WM_COPYDATA消息发送失败的问题


    问题描述 :     用非管理员权限启动dzh,dzh再启动dtssm,由于dtssm的配置文件app.manifest 中设置了requireAdministrator,导致dtssm总是以管理员权限启动的。

        故当dzh向dtssm发消息时,会发生用户界面特权隔离。

    大智慧端调用 sendMessge 时,LastError为 5 ,即拒绝访问。

    具体解释见:http://tech.it168.com/a2009/0924/737/000000737968_1.shtml

        正如我们前文所说,等级的划分,是为了防止以下犯上。所以,有了用户界面特权隔离,一个运行在较低特权等级的应用程序的行为就受到了诸多限制,它不可以:   验证由较高特权等级进程创建的窗口句柄   通过调用SendMessage和PostMessage向由较高特权等级进程创建的窗口发送Windows消息   使用线程钩子处理较高特权等级进程   使用普通钩子(SetWindowsHookEx)监视较高特权等级进程   向一个较高特权等级进程执行DLL注入

      但是,一些特殊Windows消息是容许的。因为这些消息对进程的安全性没有太大影响。这些Windows消息包括:   0x000 - WM_NULL   0x003 - WM_MOVE   0x005 - WM_SIZE   0x00D - WM_GETTEXT   0x00E - WM_GETTEXTLENGTH   0x033 - WM_GETHOTKEY   0x07F - WM_GETICON   0x305 - WM_RENDERFORMAT   0x308 - WM_DRAWCLIPBOARD   0x30D - WM_CHANGECBCHAIN   0x31A - WM_THEMECHANGED   0x313, 0x31B (WM_???)

      修复UIPI问题

      基于Windows Vista之前的操作系统行为所设计的应用程序,可能希望Windows消息能够在进程之间自由的传递,以完成一些特殊的工作。当这些应用程序在Windows 7上运行时,因为UIPI机制,这种消息传递被阻断了,应用程序就会遇到兼容性问题。为了解决这个问题,Windows Vista引入了一个新的API函数ChangeWindowMessageFilter。利用这个函数,我们可以添加或者删除能够通过特权等级隔离的Windows消息。这就像拥有较高特权等级的进程,设置了一个过滤器,允许通过的Windows消息都被添加到这个过滤器的白名单,只有在这个白名单上的消息才允许传递进来。

      如果我们想容许一个消息可以发送给较高特权等级的进程,我们可以在较高特权等级的进程中调用ChangeWindowMessageFilter函数,以MSGFLT_ADD作为参数将消息添加进消息过滤器的白名单。同样的,我们也可以以MSGFLT_REMOVE作为参数将这个消息从白名单中删除。例如:

    在dtssm的主窗口中添加如下调用即可。

    [DllImport("user32")]

    public static extern bool ChangeWindowMessageFilter(uint msg, int flags);

    private void MainForm_Load(object sender, EventArgs e)

     {

         ChangeWindowMessageFilter(WM_COPYDATA, 1);           ...   }

  • 相关阅读:
    游标定位:Cursor类
    拨号操作——android.intent.action.CALL
    按键——Button事件监听器
    文本框——EditText
    配置文件:mainfest.xml
    win7如何设置以管理员身份运行
    随机数:rand()
    std::string 和 CString问题
    文件操作:rewind()
    文件操作:fread()和fwrite()
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/4171871.html
Copyright © 2020-2023  润新知