iis 7 - CreateProcessAsUser in user session (other than 0) from service (IIS 7) -
my setting is:
- windows server 2008, iis 7
what accomplish:
- iis 7 receives request website 3d operations (in wpf) , in end iis 7 should render image , store somewhere on disk loaded website
what know , have tested yet:
- iis 7 runs service in session 0 on windows server 2008
- no service in session 0 has access video driver, no service in session 0 can perform rendering tasks (explained here: session 0 isolation)
- microsoft proposes in paper create process in user session (by createprocessasuser) perform rendering sucessfully.
what achieved until now:
- logonuser works well
- createprocessasuser works well
the (but important) part doesn't work: when logon username , password , create process user, process still in session 0 , therefore rendering fails. user logged on (i checked it). according microsoft must possible create process in user session (not session 0).
- how can create process user in other session 0?
- do have create new session myself or this?
thank you!
my code:
process_information processinfo = new process_information(); startupinfo startinfo = new startupinfo(); boolean bresult = false; intptr htoken = intptr.zero; uint32 uiresultwait = wait_failed; int processcreationflags; try { // logon user bresult = win32.logonuser( strname, strdomain, strpassword, win32.logontype.logon32_logon_batch, win32.logonprovider.logon32_provider_default, out htoken ); if (!bresult) { throw new exception("logon error #" + marshal.getlastwin32error()); } checkprivileges(htoken); // create process startinfo.cb = marshal.sizeof(startinfo); startinfo.lpdesktop = null; startinfo.dwflags = convert.toint32(startf.startf_useshowwindow); startinfo.wshowwindow = convert.toint16(showwindow.sw_hide); processcreationflags = convert.toint32(createprocessflags.create_breakaway_from_job); retstr += "command line: " + strcommand + environment.newline; bresult = win32.createprocessasuser( htoken, null, //application name strcommand, //command line intptr.zero, //process attributes intptr.zero, //thread attributes false, //inherit handles processcreationflags, //process creation flags intptr.zero, //environment curdir, //current directory ref startinfo, out processinfo ); if (!bresult) { throw new exception("createprocessasuser error #" + marshal.getlastwin32error()); } // wait process end uiresultwait = waitforsingleobject(processinfo.hprocess, infinite); if (uiresultwait == wait_failed) { throw new exception("waitforsingleobject error #" + marshal.getlastwin32error()); } } { // close handles closehandle(htoken); closehandle(processinfo.hprocess); closehandle(processinfo.hthread); }
i'm not expert in field, did searching around , seems cannot change session level, rather should have user auto-logon enabled , communicate process running under user.
this seemed useful: windows 2008 renderfarm service: createprocessasuser "session 0 isolation" , opengl
Comments
Post a Comment