2009-10-21 2 views
1

서비스 응용 프로그램과 Windows 양식 응용 프로그램을 만들었습니다. 이제 서비스에서 Windows 응용 프로그램을 시작하고 싶습니다. 나는 서비스 격리 때문에때문에 win7에서 'advapi32.dll'메소드의 'CreateProcessAsUser'를 사용하지만 'Task manager'에도 나타나지만 UI는 표시되지 않을 것입니다. 사용자에게 불쾌감을 줄 수 있습니다. 그 이유는 무엇입니까? 아무도 나를 도울 수 없나요?Windows 서비스의 UI가있는 프로세스를 어떻게 시작할 수 있습니까?

좋아 날 나는 서비스의() 메소드의 ONSTART LounchNewApplication를 호출하고

[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); 

    } 

} 

을 쓴 코드를 제공 할 수 있습니다.

답변

1

프로세스를 사용자로 시작하지만 비 대화식 세션 0에서 시작합니다. LogonUser를 사용하여 사용자 토큰을 만들지 마십시오. WTSQueryUserToken을 사용하여 프로세스를 만들 세션을 전달하십시오.이 토큰에는 올바른 세션 ID가 있습니다. WTSEnumerateSessions을 사용하여 시스템의 모든 세션을 나열하거나 서비스 핸들러에서 세션 변경 통지를 처리 ​​할 수 ​​있습니다.

+0

친애하는 Michael, 답장을 보내 주셔서 감사합니다. 이제는 win 서비스에서 응용 프로그램을 시작하고 사용자 세션에서 UI를 볼 수있게되었습니다. 대단히 감사합니다 ... – Arjuna

+0

@Arjuna, 이것이 도움이된다면 Michael이 적절한 신용을 얻도록이 대답을 받아 들여야합니다. –

0

기술적으로 서비스는 대화 형으로 표시되어야합니다. sc config <servicename> type= interact.

서비스가 콘솔과 상호 작용하지 않아야하며, 서비스가 시작되지 않아야합니다. 운 좋게도이 문제는 Windows 2003 이후에 수정되었으며 Vista에서는 Windows 2008 및 Windows 7이 점점 더 어려워지고 있습니다.

올바른 방법은 응용 프로그램을 서비스와 모니터 응용 프로그램으로 분리하는 것입니다. 모니터는 사용자 세션에서 일반 응용 프로그램으로 실행되며 IPC를 통해 서비스와 통신합니다.

관련 문제