主要**如下:
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...