1

サービス アプリケーションと Windows フォーム アプリケーションを作成しました。サービスから Windows アプリケーションを起動したいと考えています。win7 では、サービスの分離のためにこれを直接行うことはできないので、「advapi32.dll」メソッドの「CreateProcessAsUser」を使用しましたが、「タスク マネージャー」にも表示されるプロセスを作成できますが、UI は表示されません。ユーザーに。理由は何ですか ?誰かがこれから私を助けることができますか?

わかりました、私が書いたコードを教えてください

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

  }

}

サービスの LonchNewApplication() メソッド OnStart を呼び出しています。

4

2 に答える 2

1

ユーザーとしてプロセスを起動していますが、非対話型のセッション 0 で起動しています。LogonUser を使用してユーザー トークンを作成しないでください。WTSQueryUserTokenを使用して、プロセスを作成するセッションを渡します。このトークンには正しいセッション ID があります。WTSEnumerateSessionsを使用して、マシン上のすべてのセッションを一覧表示したり、サービス ハンドラーでセッション変更通知を処理したりできます。

于 2009-10-21T19:23:43.303 に答える
0

技術的には、サービスはインタラクティブとしてマークする必要があります。sc config <servicename> type= interact.

サービスはコンソールとやり取りしてはならず、サービスの起動時には絶対にやり取りしないでください。幸いなことに、これは Windows 2003 以降で修正されており、Vista、Windows 2008、および Windows 7 では、このような不正行為を行うことがますます難しくなっています。

適切な方法は、アプリケーションをサービスと監視アプリケーションに分離することです。モニターは、ユーザー セッションで通常のアプリケーションとして実行され、IPC を介してサービスと通信します。

于 2009-10-21T19:24:44.097 に答える