用服务启动界面程序_第1页
用服务启动界面程序_第2页
用服务启动界面程序_第3页
用服务启动界面程序_第4页
用服务启动界面程序_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、#ifndef_win32_winnt#define _win32_winnt 0x0501#enchf#ifndef winver#define winver 0x0501#endif#inelude vwindows.h>#include <tlhelp32.h>#include <wtsapi32.h>#pragma commentflib, "wtsapi32.lib")/ launchwithacticesession()用于在service中把一个程序以当前活动会话的用户权限运行 起来/ szexename可执行程序全路径,同cre

2、ateprocess()m一个参数/ szcmdline执彳亍程序的命令行,同createprocessf)第二个参数/ szcurrentdirectory程序运行的当前目录,同createprocessf)笫三个参数/ bshowwindow 该程序是否显示界面/ bwait是否等待该程序退出/ iphandle此参数可以返冋进程的handledword launchwithacticesession( in lpctstr szexename, in lptstr szcmdline=null, in lpctstr szcurrentdirectory=null, in bool bs

3、howwindow=true, in bool bwait二false, out handle *lphandle二null );dword getlogonsid( in handle htoken, out psid *ppsid )dword dwresult = 0;dword dwlndex = 0;dword dwlength = 0;bool bfound = 0;ptoken_groups ptg = null;doif ( null = ppsid )dwresult = formaterror(error_invalid_parameter); break;讦(!:gett

4、oke nlnformation( h token, token groups, (lpvoid)ptg, 0, & dwle ngth )dwresult = :getlasterror();讦(errornsufficient_buffer != dwresult)formaterror(dwresult); break;dwresult = 0;ptg = (ptoken_groups):heapalloc( :getprocessheap(), heap_zero_memory; dwlength );if ( ptg = null )dwresult = formaterro

5、r(error_not_enough_memory); break;if ( !:gettoke nlnformation( htoken, tokengroups, (lpvoid)ptg, dwle ngth,&dwlength )dwresult = formaterror(:getlasterror(j); break;for ( dwlndex=0; dwlndex<ptg->groupcount; dwlndex+ )讦 ( (ptg->groupsdwlndex.attributes&se_group_logo nd) =se_group_log

6、on_id )bfound =true;dwlength = :getlengthsid( ptg->groupsdwlndex.sid );*ppsid = (psid):heapalloc( :getprocessheap(), heap_zero_m emory; dwlength );讦(*ppsid = null )dwresult = formaterror(error_not_enough_memory); break;if ( !:copysid(dwlength, *ppsidz ptg->groupsdwlndex.sid)dwresult = formater

7、ror(:getlasterror();:heapfree(:getprocessheap(), 0, (lpvoid)*ppsid );break;break;讦(dwresult) break;if ( sbfound )dwresult = formaterror(error_file_not_found); break; while (0);if ( ptg):heapfreef:getprocessheapo, 0, (lpvoid)ptg );return dwresult;#define desktop_all (desktop_readobjects | desktop_cre

8、atewindow | desktop_createmenu | desktop_hookcontrol | desktopjournalrecord | desktopjournalplayback | desktop_en um erate | d es kto p_ w riteo bj ects | desktop_switchdesktop | standard_rights_required)#define winsta_all (winsta_enumdesktops | winsta_readattributes | winsta_accessclipboard | winst

9、a_createdesktop | winsta_writeattributes | winsta_accessglobalatoms | winsta_exitwindows | winsia_enumerate | winsta_readscreen | standard_rights_required)#define generic_access (generic_read | generic_write | generic_execute generic_all)dword addacetowindowstation(hwinsta hwinsta, psid psid)dworddw

10、result = 0;access_allowed_ace *pace = null;acl size information acisizelnfo;boolbdaclexist;boolbdacipresent;dworddwnewacisize;dworddwsidsize = 0;dworddwsdsizeneeded;paclpad;paclpnewaci = null;psecurity_descriptor psd = null;psecurity_descriptor psdnew = null;pvoidptempace;security information si = d

11、acl security information; unsigned inti;doif ( !:getuserobjectsecurity( hwinsta, &si, psd, dwsidsize, &dwsdsizeneeded) dwresult = :getlasterror();if ( dwresult != error_insufficient_buffer )formaterror(dwresult); break;dwresult = 0;psd = (psecurity_descriptor):heapalloc( :getprocessheapf), h

12、eap_zero_memory; dwsdsizeneeded );讦(psd = null)dwresult = formaterror(error_not_enough_memory); break;psdnew = (psecurity_descriptor):heapalloc( :getprocessheap(), heap_zero_memor; dwsdsizeneeded );讦(psdnew = null)dwresult = formaterror(error_not_enough_memory); break;dwsidsize = dwsdsizeneeded;if (

13、 !:getuserobjectsecurity( hwinsta, &si, psd, dwsidsize, &dwsdsizeneeded )dwresult = formaterror(:getlasterror(); break;讦(!:lnitializesecuritydescriptor( psdnew, security_descriptor_revision )dwresult = formaterror(:getlasterror(); break;if ( !:getsecuritydescriptordacl( psd, &bdaclpresen

14、t, &pacl, &bdaclexist)dwresult = formaterror(:getlasterror(); break;zeromemory(&aclsizelnfo, sizeof(acl_sizenformation);acisizelnfo.acibytesinllse = sizeof(acl);if ( pad != null )if(!:getacllnformation(pad,(lpvoid)&aclsizelnfo,sizeof(acl_sizenformation), acisizelnformation )dwresult

15、= formaterror(:getlasterror(); break;dwnewacisize = acisizelnfo.acibytesinuse + (2*sizeof(access_allowed_ace) +(2*:getlengthsid(psid) - (2*sizeof(dword);pnewaci =(pacl):汨 eapalloc(:getprocessheap(), heap_zero_memory,dwnewacisize);讦(pnewaci = null )dwresult = formaterror(error_not_enough_memory); bre

16、ak;if ( !:lnitializeacl(pnewacl, dwnewacisize, acl_revision)dwresult = formaterror(:getlasterror(); break;讦(bdacipresent)if (acisizel nfo.acecou nt)for (i=0; i < acisizelnfo.acecount; i+)if ( !:getace(pacl i, &ptempace)dwresult = formaterror(:getlasterror(); break;讦(!::addace( pnewaci, acl_re

17、vision, maxdword, ptempace,(pace_header)ptempace)->acesize)dwresult = formaterror(:getlasterror(); break;if ( dwresult) break;pace = (access_allowed_ace *):heapalloc(:getprocessheap()zheap_zero_memor£ sizeof(access_allowed_ace) + :getlengthsid(psid) - sizeof(dword);if ( pace = null )dwresult

18、 = formaterror(error_not_enough_memory); break;pace->header.acetype = access_allowed_ace_type;pace->header.aceflags = container_inherit_ace | inherit_only_ace | object inherit ace;pace->header.acesize=loword(sizeof(access_allowed_ace)+ :getlengthsid(psid) - sizeof(dword);pace->mask= gene

19、ric_access;if ( !:copysid(:getlengthsid(psid), &pace->sidstart, psid)(lpvoid)pace,(lpvoid)pace,if ( !:addace( pnewaci, acl_revision, maxdword, pace->header.acesize)dwresult = formaterror(:getlasterror(j); break;pace->header.aceflags = no_propagate_inherit_ace; pace->mask= winsta_all;

20、讦(!:addace(pnewaci, acl_revision, maxdword,pace->header.acesize)dwresult = formaterror(:getlasterror(); break;if ( !:setsecuritydescriptordacif psdnew, true, pnewaci, false)dwresult = formaterror(:getlasterror(); break;if ( !:setuserobjectsecurity(hwinsta, &si, psdnew)dwresult = formaterror(:

21、getlasterror(j); break; while (0);讦(pace != null):heapfree(:getprocessheap(), 0, (lpvoid)pace);if (pnewaci != null):heapfree(:getprocessheap(), 0, (lpvoid)pnewacl);讦(psd != null):heapfree(:getprocessheapo, 0, (lpvoid)psd);讦(psdnew != null):汨eapfree(:getprocessheapo, 0, (lpvoid)psdnew);return dwresul

22、t;dword addacetodesktop(hdesk hdesk, psid psid)dworddwresult = 0;acl size information acisizelnfo;mb夕boolbdaclexist;boolbdacipresent;boolbsuccess = false;dworddwnewacisize;dworddwsidsize = 0;dworddwsdsizeneeded;paclpad;paclpnewaci = null;psecurity_descriptor psd = null;psecurity_descriptor psdnew =

23、null;pvoidptempace;securityjnformation si = dacl_security_information; unsigned inti;doif ( !:getuserobjectsecurity( hdesk, &si, psd, dwsidsize, &dwsdsizeneeded)dwresult = :getlasterror();讦(dwresult != error_insufficient_buffer )formaterror(dwresult); break;dwresult = 0;psd = (psecurity_desc

24、riptor):heapalloc( :getprocessheap(), heap_zero_memor£ dwsdsizeneeded );讦(psd = null)dwresult = formaterror(error_not_enough_memory); break;psdnew = (psecurity_descriptor):heapalloc( :getprocessheapf), heap_zero_memory; dwsdsizeneeded );讦(psdnew = null)dwresult = formaterror(error_not_enough_me

25、mory); break;dwsidsize = dwsdsizeneeded;if ( !:getuserobjectsecurity( hdesk, &si, psd, dwsidsize, &dwsdsizeneeded )if ( !:lnitializesecuritydescriptor( psdnew, security_descriptor_revision)dwresult = formaterror(:getlasterror(); break;if ( !:getsecuritydescriptordacl( psd, &bdacipresent,

26、 &pacl, &bdaclexist)dwresult = formaterror(:getlasterror(); break;zeromemory依acisizelnfo, sizeof(acl_size_information); acisizelnfo.acibytesinuse = sizeof(acl);if (pad != null)讦(!:getacllnformation(pad,(lpvoid)&aclsizelnfo,sizeof(acl_sizenformation), acisizelnformation )dwresult = format

27、error(:getlasterror(); break;dwnewacisize= acisizelnfo.acibytesinuse + sizeof(access_allowed_ace)+ :getlengthsid(psid) - sizeof(dword);pnewaci =(pacl):heapalloc( :getprocessheap(), heap_zero_memory;dwnewacisize);讦(pnewaci = null)dwresult = formaterror(error_not_enough_memory); break;if ( !:lnitializ

28、eacl(pnewacl, dwnewacisize, acl revision)dwresult = formaterror(:getlasterror(); break;if (bdacipresent)if (acisizel nfo.aceco unt)for (i=0; i < acisizelnfo.acecount; i+)讦(!:getace(paclz i, &ptempace)dwresult = formaterror(:getlasterror(); break;讦(!:addace( pnewaci, acl_revision, maxdword, pt

29、empace, (pace_header)ptempace)->acesize)dwresult = formaterror(:getlasterror(); break;if ( dwresult) break;if ( !:addaccessallowedace( pnewaci, acl_revision, desktop_all, psid)dwresult = formaterror(:getlasterror(); break;if ( !:setsecuritydescriptordacl( psdnew, true, pnewaci, false )dwresult =

30、formaterror(:getlasterror(); break;if ( !:setuserobjectsecurity(hdesk, &si, psdnew)dwresult = formaterror(:getlasterror(); break; while (0);讦(pnewaci != null):heapfree(:getprocessheapf), 0, (lpvoid)pnewacl);讦(psd != null):heapfree(:getprocessheapo, 0, (lpvoid)psd);讦(psdnew != null):heapfree(:get

31、processheapf), 0, (lpvoid)psdnew);return dwresult;void freelogonsid( psid *ppsid ):heapfreef:getprocessheapo, 0, (lpvoid)*ppsid );dword getsessionllsername(dword dwsessionld, out lptstr ipszusername )dwsessionld,dwsessionld,lptstrpbuffer = null;dword dwbufferlen = 0;doif ( !:wtsquerysessionlnformati

32、on(wts_current_server_handle, wtsusername, &pbuffer, &dwbufferlen)dwresult = formaterror(:getlasterror(); break;_tcscpy( ipszusername, pbuffer); while (0);讦(pbuffer):wtsfreememory(pbuffer);return dwresult;dword getsessiondomain(dword dwsessionld, out lptstr ipszdomainname ) dword dwresult =

33、0;lptstr pbuffer = null;dword dwbufferlen = 0;doif ( !:wtsquerysessionlnformation(wts_current_server_handlez wtsdomainname, &pbuffer, &dwbufferlen)dwresult = formaterror(:getlasterror(); break;_tcscpy( ipszdomainname, pbuffer); while (0);讦(pbuffer):wtsfreememory(pbuffer);return dwresult;dwor

34、d launchwithacticesession( in lpctstr szexename, in lptstr szcmdline/*=null*/z in lpctstr szcurrentdirectory/*=null*/, in bool bshowwindow/*=true*/z in bool bwait/*=false*/z out handle *lphandle/*=null*/)dword dwresult = 0;dword dwactivesessionld = 0;handle hactivesessiontoken = invalid_handle_value

35、;dworddwexitcode = error_success;psidpsid = null;hwinstahwinstasave =null;hwinstahwinsta = null;hdeskhdesk = null;processjnformation pi;dosi.dwflagsif ( bshowwindow)si.wshowwindowelsesi.wshowwindow=startf_useshowwindow;=sw showdefault;startupinfosi;= sw_hide;lllllllllllllllllllllllllllllllllllllllll

36、llllllllllllllllllllllllllllllllldwactivesessionld = : wtsgetactiveconsolesessionld();if ( oxffffffff = dwactivesessionld )dwresult = formaterror(:getlasterror(); break;讦(!:wtsqueryusertoken( dwactivesessionld, &hactivesessiontoken )formaterror(:getlasterror();/ wtsgetactiveconsolesessionld()取出来

37、的会话id不可用,枚举所有会话wts_sessionnfo *lpsessionlnfo = null;dword dwsessionlnfocount = 0;dword dwsessionldthis = -1;tchar szdomain256 = 0;tchar szllsername256 = 0;doif ( !:wtsenumeratesessions( wts_current_server_handle, 0, 1, &lpsessionlnfo, &dwsessionlnfocount)dwresult = formaterror( :getlasterror

38、(); break;if ( dwsessionlnfocount = 0 )dwresult = formaterror( error_file_not_found ); break; / 无活 动会话for ( dword i=0; i<dwsessionlnfocount; i+ )rtlzeromemory( szdomain, sizeof(szdomain);rtlzeromemory( szusername, sizeof(szusername);getsessiondomain( lpsessionlnfoi.sessionld, szdomain ); getsessi

39、onusername( ipsessionlnfoi.sessionld, szusername );for (i=0; i<dwsessionlnfocount; i+ )if ( lpsessionlnfoi.state = wtsactive 11 lpsessionlnfoi.state = wtsdisconnected )if (ipsessionlnfoisessionld != dwactivesessionld )dwsessionidthis = ipsessionlnfoi.sessionld; break;if ( dwsessionldthis = -1)dwr

40、esult = formaterrorf error_file_not_found ); break; / 无活 动会话 while (0);if (ipsessionlnfo ):wtsfreememory(lpsessionlnfo);讦(dwresult) break;lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllldwactivesessionld = dwsessio nidthis;/mydbgprintf _t("set dwactivesessionld = %luh)

41、, dwactivesessionld );if ( !:wtsqueryusertoken( dwactivesessionld, &hactivesessiontoken )/当会话是远程桌面连接时(会话state=wtsdisconnected),不能获取令 牌,总是返回122/ 参考 dwresult = formaterror( :getlasterror(); break;llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllhwinstasave = :getprocesswin

42、dowstati on();if ( null = hwinstasave )dwresult = formaterror(:getlasterror(); break;hwinsta=:openwindowstation(_t("winstao”),false,read_control| write_dac );if ( null = hwinsta )dwresult = formaterror(:getlasterror(); break;讦(!:setprocesswindowstation(hwinsta)dwresult = formaterror(:getlasterror(); break;hdesk=:opendesktop("default"),0zfalse,read_control|write_dac|desktop_writeobjects|desktop_readobjects );if ( !:setprocesswindowstation(hwinstasave)dwresult = forma

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论