问题描述 : 用非管理员权限启动dzh,dzh再启动dtssm,因为dtssm的配置文件app.manifest 中设置了requireAdministrator,致使dtssm老是以管理员权限启动的。html
故当dzh向dtssm发消息时,会发生用户界面特权隔离。安全
大智慧端调用 sendMessge 时,LastError为 5 ,即拒绝访问。app
具体解释见:http://tech.it168.com/a2009/0924/737/000000737968_1.shtml函数
正如咱们前文所说,等级的划分,是为了防止如下犯上。因此,有了用户界面特权隔离,一个运行在较低特权等级的应用程序的行为就受到了诸多限制,它不能够: 验证由较高特权等级进程建立的窗口句柄 经过调用SendMessage和PostMessage向由较高特权等级进程建立的窗口发送Windows消息 使用线程钩子处理较高特权等级进程 使用普通钩子(SetWindowsHookEx)监视较高特权等级进程 向一个较高特权等级进程执行DLL注入ui
可是,一些特殊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做为参数将这个消息从白名单中删除。例如:orm
在dtssm的主窗口中添加以下调用便可。htm
[DllImport("user32")]
public static extern bool ChangeWindowMessageFilter(uint msg, int flags);
private void MainForm_Load(object sender, EventArgs e)
{
ChangeWindowMessageFilter(WM_COPYDATA, 1); ... }