2011-08-26 64 views
8

我想从WCF服务端的内部网客户端运行一个进程。在我的情况下,客户请求服务器在提供的证书下在服务器的机器上创建一个新进程。 WCF服务托管在IIS 7.5和我使用此代码如何从IIS托管的WCF服务启动进程?

var processInfo = new ProcessStartInfo("C:\\Windows\\System32\\notepad.exe") 
{ 
    UserName = "some user", 
    Password = MakeSecureString("some password"), 
    UseShellExecute = false, 
    LoadUserProfile = true 
}; 

Process process = Process.Start(processInfo); 
启动一个进程

如果我是主持人WCF服务为自托管控制台应用程序下,管理员用户运行,我看到记事本在另一个用户启动此代码工作。它无法在IIS上有没有异常,但处理立即终止

process.HasExited = true; 
process.ExitCode = -1073741502; 

在IIS WCF应用具有管理员权限的用户下运行,并已获得在web.config中定义的完全信任。我无法使用自托管的应用程序,因为它不支持简单的持续交付(如WebDeploy与IIS网站)。

问:如何从IIS上托管的WCF服务启动服务器端的进程?

编辑:
我偶然发现了这个post,类似的问题,我想那里所有的方法,包括的Process.Start与CreateProcessWithLogonW的P/Invoke和CreateProcessAsUser所有可能的变化我也试过授予额外的权限给用户。非此,将与错误消息相同的人张贴。

+0

任何具有完整源代码示例的最终解决方案? – Kiquenet

+0

没有肮脏的黑客是不可能的。我没有这样做。 – oleksii

+0

哪个脏骇客? – Kiquenet

回答

4

奥莱克西的一点是,如果你的主机在一个控制台应用程序的WCF服务,有一个Windows会话(用户登录和Windows资源管理器中加载)为用户和记事本打开并显示该用户,所以你可以在用户界面中看到它。

当您在IIS中托管您的WCF服务时,作为服务器,IIS需要并且不允许用户交互,并且在没有用户登录时也可以工作;在这种情况下,没有用户界面来托管您的记事本或其他启用了UI的应用程序,您可以执行一个进程以进行细化或其他批处理作业,但不会呈现Windows UI应用程序,因为Windows资源管理器未加载给您,并且没有地方呈现您的流程的用户界面。

+1

我希望WCF服务托管在IIS中(用户A在AppPool中),并在我使用Process.Start调用我的命令EXE(命令行,而不是UI)时与另一个用户B模拟。有什么建议么?也许不可能。 – Kiquenet

1

这里是我用来调用GnuPGP做加密。你的设置如何比较?

private int ExecuteCommand(string arguments, string passPhrase, int timeout) 
     { 
      Process processObject; 
      ProcessStartInfo pInfo = new ProcessStartInfo(_executablePath, arguments); 


      pInfo.CreateNoWindow = true; 
      pInfo.UseShellExecute = false; 

      pInfo.RedirectStandardInput = true; 
      pInfo.RedirectStandardOutput = true; 
      pInfo.RedirectStandardError = true; 
      processObject = Process.Start(pInfo); 

      if (!string.IsNullOrEmpty(passPhrase)) 
      { 
       processObject.StandardInput.WriteLine(passPhrase); 
       processObject.StandardInput.Flush(); 
      } 

      string result = processObject.StandardOutput.ReadToEnd(); 
      string error = processObject.StandardError.ReadToEnd(); 

      if (!processObject.WaitForExit(timeout)) 
      { 
       throw new TimeoutException("GnuPG operation timeout. Waited " + timeout + " milliseconds "); 
      } 

      int exitcode = processObject.ExitCode; 

      Error = error; 
      Output = result; 

      return exitcode; 

     } 
+0

没有这不会帮助这行后'processObject = Process.Start(pInfo);'它hasExited设置为true。 – oleksii

+0

你不是真的想跑记事本,对吗? –

+0

实际上,我是一个测试其他软件功能以检测进程启动的测试工具。 – oleksii

1

有一个应用程序池设置,以确保它加载用户配置文件。

loadUserProfile Optional Boolean attribute. 

Specifies whether IIS loads the user profile for the application pool identity. Setting  
this value to false causes IIS to revert to IIS 6.0 behavior. IIS 6.0 does not load the 
user profile for an application pool identity. 

The default value is false. 

与域用户一起作为具有足够权限的身份可能会工作?我知道用户至少需要一个用户配置文件。

这就是说,它有点奇怪的架构。看起来像一个更好的拱门将是有一个持久的过程像网站与之通信的Windows服务,但我不确定你的约束是什么。

希望有所帮助。

+0

感谢您的回答。这是有道理的。使用IIS,通过WebDeploy交付产品会更容易,因为我可以创建Web场。也就是说,我尝试了Win Service,并且在那里也遇到了相同的问题。我正在逆转命令行托管和脚本部署,因为在IIS上配置它很痛苦。 – oleksii