How can i lauch a process which has a UI from Windows service?

核能气质少年 提交于 2020-01-05 08:45:54

问题


I have created a service application and also a windows form application now i want to lauch windows application from the service. I know that in win7 because of service isoloation you con't do this directly so i used 'CreateProcessAsUser' of 'advapi32.dll' method but it is able to create the process also appearing in 'Task manager' but UI will not be displeyd to the user. What is the reason ? anybody can help me out of this?

Ok let me give the code which i have written

[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Ansi, EntryPoint = "CreateProcessAsUser")] 

public static extern bool CreateProcessAsUser(IntPtr hToken,string lpApplicationName,string lpCommandLine,ref SECURITY_ATTRIBUTES lpProcessAttributes, ref SECURITY_ATTRIBUTES lpThreadAttributes,bool bInheritHandles,int dwCreationFlags,string lpEnvironment,string lpCurrentDirectory,ref STARTUPINFO lpStartupInfo,ref PROCESS_INFORMATION lpProcessInformation);


void LounchNewApplication() 

{


 try

  { 

      string strAppName = @"D:\Working\UAC Demo\Tester\bin\Debug\Tester.exe"; 

      string strAppPath = @"D:\Working\UAC Demo\Tester\bin\Debug\";

      PROCESS_INFORMATION lpProcessInformation = new PROCESS_INFORMATION(); 

      SECURITY_ATTRIBUTES lpProcessAttributes = new SECURITY_ATTRIBUTES(); 

      lpProcessAttributes.nLength = (uint)Marshal.SizeOf(lpProcessAttributes); 

      STARTUPINFO lpStartupInfo = new STARTUPINFO(); 

      lpStartupInfo.cb = Marshal.SizeOf(lpStartupInfo); 

      lpStartupInfo.lpDesktop = "WinSta0\\Default"; 
      IntPtr htoken = IntPtr.Zero; 

      LogonUser("myName", "DomineName", "password", 2, 0, out htoken); 


      if (!CreateProcessAsUser(htoken, strAppName, null, ref lpProcessAttributes,
         ref lpProcessAttributes, true, 0, null, strAppPath, ref lpStartupInfo,
         ref lpProcessInformation)) 

        {

          eventLogger.WriteEntry("Error in starting application", EventLogEntryType.Error); 

        }
     else
         eventLogger.WriteEntry("Application launched successfulll" EventLogEntryType.Information); 




      //CloseHandle(lpProcessInformation.hThread);



      //CloseHandle(lpProcessInformation.hProcess);

  }



  catch (Exception ex) 

  {

    eventLogger.WriteEntry(ex.Message,


     EventLogEntryType.Error); 

  }

}

I am calling LounchNewApplication() method OnStart of the service .


回答1:


You are launching the process as the user but in session 0, which is non-interactive. Don't use LogonUser to create a user token. Use WTSQueryUserToken, passing in the session you want to create the process in. This token has the correct session ID. You can use WTSEnumerateSessions to list all sessions on the machine, or handle session change notifications in your service handler.




回答2:


Technically, the service must be marked as interactive, eg. sc config <servicename> type= interact.

Services should no interact with the console, and definetely absolutely not in service startup. Luckly this was fixed post Windows 2003 and in Vista, Windows 2008 and Windows 7 is getting harder and harder to do such misbehavior.

The proper way is to separate your application into a service and a monitor application. The monitor runs as a normal application on the user session and communicates with the service via IPC.



来源:https://stackoverflow.com/questions/1602996/how-can-i-lauch-a-process-which-has-a-ui-from-windows-service

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!