How can i lauch a process which has a UI from Wind

2019-08-09 04:09发布

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 .

2条回答
beautiful°
2楼-- · 2019-08-09 04:42

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.

查看更多
Emotional °昔
3楼-- · 2019-08-09 04:49

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.

查看更多
登录 后发表回答