用非管理員權限啓動主程序,並用管理員權限啓動子程序,致使WM_COPYDATA消息發送失敗的問題

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

相關文章
相關標籤/搜索