怎樣去掉「互動式服務對話方塊檢測」提示對話方塊

2021-07-11 12:30:46 字數 3167 閱讀 8517

背景:

在win7以上的系統,當系統服務要彈出對話方塊的時候,會彈出「互動式服務對話方塊檢測」提示對話方塊。

原因分析:

真正的問題是windows 7 服務的session 0 隔離機制

在windows xp, windows server 2003或者更早期的windows作業系統中,所有的服務和應用程式都是執行在與第乙個登入到控制台的使用者得session中。這個session叫做session 0。在session 0 中一起執行服務和使用者應用程式,由於服務是以高許可權執行的,所以會造成一些安全風險。這些因素使得一些惡意**利用這點,來尋找提公升他們自身許可權的結構。

在windows vista中,服務在乙個叫做session 0 的特殊session中承載。由於應用程式執行在使用者登入到系統後所建立的session 0 之後的session中,所以應用程式和服務也就隔離開來:第乙個登入的使用者在session 1中,第二個在session 2中,以此類推。事實上執行在不同的session中,如果沒有特別將其放入全域性命名空間(並且設定了相應的訪問控制配置),是不能互相傳遞窗體訊息,共享ui元素或者共享kernel物件。下面的圖例中,將進行**:

上述解說參照的部落格:

解決方案:

2.如果你編寫服務的時候,想要直接彈出對話方塊,同時不彈出「互動式服務對話方塊檢測」提示對話方塊。可以模擬當前使用者來彈出對話方塊。

這裡邊用c語言,簡單描述一下做法。

test.h 

//dword winapi wtsgetactiveconsolesessionid();

typedef dword (winapi *pwtsgetactiveconsolesessionid)(void);

pwtsgetactiveconsolesessionid wtsgetactiveconsolesessionid;

//bool winapi createenvironmentblock( __out lpvoid *lpenvironment, __in_opt handle htoken, __in bool binherit);

//bool winapi destroyenvironmentblock( __in lpvoid lpenvironment);

typedef bool (winapi *pcreateenvironmentblock)( lpvoid *lpenvironment, handle htoken, bool binherit);

typedef bool (winapi *pdestroyenvironmentblock)( lpvoid lpenvironment);

pcreateenvironmentblock createenvironmentblock;

pdestroyenvironmentblock destroyenvironmentblock;

//bool winapi wtsqueryusertoken( ulong sessionid, phandle phtoken);

typedef bool (winapi *pwtsqueryusertoken)( ulong sessionid, phandle phtoken);

pwtsqueryusertoken wtsqueryusertoken;

test.c

hinstance hkernel32lib,hwtsapi32lib,huserenvlib;

handle htokenthis = null;

handle hduplicatedtoken = null;

lpvoid lpenvironment = null;

dword dwsessionid;

char curdir[_max_path];

int pos;

osversioninfoex os;

startupinfo si= ;

process_information pi = ;

si.cb = sizeof(si);

si.lpdesktop = text("winsta0\\default");

si.wshowwindow = sw_shownormal;

//對話方塊程式

getmodulefilename(null,curdir,_max_path);

pos = strlen(curdir)-strlen(strrchr(curdir,'\\'));

strncpy(curdir,curdir,pos);

curdir[pos] ='\0';

strcat(curdir,"\\msgdlg.exe");

//載入需要的動態鏈結庫,vc6.0的時候需要

hkernel32lib = loadlibrary("kernel32.dll");

hwtsapi32lib = loadlibrary("wtsapi32.dll");

huserenvlib = loadlibrary("userenv.dll");

if( (hkernel32lib != null) && (hwtsapi32lib!=null) && (huserenvlib!=null))

closehandle(pi.hprocess);

closehandle(pi.hthread);

} }if( htokenthis !=null )

closehandle(htokenthis);

if( hduplicatedtoken !=null )

closehandle(hduplicatedtoken);

if( lpenvironment !=null )

destroyenvironmentblock(lpenvironment);

freelibrary(hkernel32lib);

hkernel32lib=null;

freelibrary(huserenvlib);

huserenvlib=null;

freelibrary(hwtsapi32lib);

hwtsapi32lib=null;

QT對話方塊去掉幫助或者關閉按鈕

建了乙個對話方塊,我不想把邊框去掉,只想去掉關閉按鈕,setwindowflags windowflags qt windowclosebuttonhint qt windowcontexthelpbuttonhint 結果那個問號的按鈕去掉了,但是關閉按鈕還在 setwindowflags qt ...

windows 服務中啟動互動式程式

最近專案中需要在windows服務中啟動互動式程式,還是費了點勁,記錄一下 互動式程式也就是需要與人互動的程式,比如帶有介面的程式,需要接收使用者滑鼠鍵盤訊息的程式。比如 notepad.exe,cmd.exe 非互動式程式也就是跑在後台,不需要人工干預,自己能跑得歡的程式 比如各種服務端程式,類似...

ActiveX加入嵌入式對話方塊

在用mfc activex開發控制項時,將乙個對話方塊新增到工程,然後在這個對話方塊上開發控制項需要的應用,能更好的利用mfc帶來的方便.具體步驟如下 1 建立乙個基於mfc的activex工程 2 在工程的資源檢視中,新增乙個新的對話方塊,並且將對話方塊的樣式設定為,style child,bor...