服務程序建立乙個帶視窗的程序,過UAC

2021-06-18 02:10:44 字數 2570 閱讀 1173

主要**如下:

dword findsessionpid(lpstr lpprocessname, dword dwsessionid)

procentry.dwsize = sizeof(processentry32);

if (!process32first(hsnap, &procentry))

do }

} while (process32next(hsnap, &procentry));

_end:

closehandle(hsnap);

return res;

}if(pfnwtsqueryusertoken == null)

dwsessionid = pfnwtsgetactiveconsolesessionid();

winlogonpid = findsessionpid("explorer.exe", dwsessionid);

if(winlogonpid == 0)

if(winlogonpid == 0)

dwcreationflags = normal_priority_class|create_new_console;

zeromemory(&si, sizeof(startupinfo));

si.cb= sizeof(startupinfo);

si.lpdesktop = "winsta0\\default";

zeromemory(&pi, sizeof(pi));

token_privileges tp;

luid luid;

lpvoid tokeninformation;

dword retlen = 0;

if( !pfnwtsqueryusertoken(dwsessionid, &husertoken) )

if(hptoken == null)

}else

if(gettokeninformation(hptoken, tokenlinkedtoken, &tokeninformation, 4, &retlen))

else

if(!duplicatetokenex(hptoken, maximum_allowed, null, securityidentification, tokenprimary, &husertokendup))

}lpvoid penv = null;

if(createenvironmentblock(&penv, husertokendup, true))

else

// launch the process in the client's logon session.

bresult = createprocessasuser(

husertokendup, // client's access token

null, // file to execute

lpcmdline, // command line

null, // pointer to process security_attributes

null, // pointer to thread security_attributes

false, // handles are not inheritable

dwcreationflags, // creation flags

penv, // pointer to new environment block

null, // name of current directory

&si, // pointer to startupinfo structure

&pi // receives information about new process

);// end impersonation of client.

//getlasterror shud be 0

int iresultofcreateprocessasuser = getlasterror();

if(bresult == false && iresultofcreateprocessasuser != 0)

if(pi.hprocess)

if(pi.hthread)

//perform all the close handles task

if(hprocess)

if(husertoken)

if(husertokendup)

if(hptoken)

if(penv)

return bresult;

}呼叫方式:

前提是有個服務程序已經啟動,然後服務程序會以管理員模式(不需要使用者點uac的框)啟動乙個新的可以建立視窗的程序。

安裝這個服務需要點uac的框,所以不是什麼不可公開的思路。好處就一點:每次自啟動的程序,不需要再讓使用者點uac框了

程序的建立之Unix環境fork乙個程序

如果執行的是父程序,則返回的pid號為非負,如果為子程序,pid返回為0,在unix系統中,父程序建立子程序之後,先執行子程序,再執行父程序 int main pid t pid pid fork 建立子程序 if pid 0 fprintf stderr,fork failed exit 1 el...

Linux如何建立乙個程序

每個程序都有以下屬性 棧 stack 以幀為單位,當程式呼叫函式 假如該函式名為fun01 時,stack會向下增長一幀,這個幀會儲存該函式的引數 區域性變數以及返回位址,計算機將控制權交給fun01,fun01處於啟用狀態,這時 global data 和 該幀中的區域性變數共同構成了contex...

Linux如何建立乙個程序

每個程序都有以下屬性 棧 stack 以幀為單位,當程式呼叫函式 假如該函式名為fun01 時,stack會向下增長一幀,這個幀會儲存該函式的引數 區域性變數以及返回位址,計算機將控制權交給fun01,fun01處於啟用狀態,這時 global data 和 該幀中的區域性變數共同構成了contex...