問題描述 : 用非管理員權限啓動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); ... }