Process.Start不起作用

时间:2014-10-20 02:30:24

标签: c# asp.net iis

我正在尝试从网页的后端代码/应用程序池启动流程。这个过程将启动我自己构建的应用程序。

出于某种原因,当我从VS2013启动它时,该过程才有效/运行...当我从IIS(7.5)本身启动它时它永远不会工作。

我在Windows 7计算机上(IIS主机和应用程序位置),我设置的网站只能通过内部网络访问。

这里是代码,然后是config /尝试解决问题:

protected void btn_DoIt_Click(object sender, EventArgs e)
{
    string file_text = this.txt_Urls.Text;

    if (!String.IsNullOrWhiteSpace(file_text))
        File.WriteAllText(ConfigurationManager.AppSettings["filePath"], file_text);

    ProcessStartInfo inf = new ProcessStartInfo();

    SecureString ss = GetSecureString("SomePassword");
    inf.FileName = @"........\bin\Release\SomeExecutable.exe";
    inf.Arguments = ConfigurationManager.AppSettings["filePath"];
    inf.UserName = "SomeUserName";
    inf.Password = ss;
    inf.UseShellExecute = false;
    //launch desktop app, but don't close it in case we want to see the results!
    try
    {
        Process.Start(inf);
    }
    catch(Exception ex)
    {
        this.txt_Urls.Text = ex.Message;
    }

    this.txt_Urls.Enabled = false;
    this.btn_DoIt.Enabled = false;
    this.txt_Urls.Text = "Entries received and process started. Check local machine for status update, or use refresh below.";
}

以下是我尝试解决此问题的事项:

  1. 确保执行程序集是使用AnyCPU而不是使用 86
  2. 确保运行该应用的AppPool也在与指定的ProcessStartInfo相同的帐户(SomeUsername)下运行。
  3. 确保特定用户帐户具有对可执行文件夹的完全访问权限。
  4. 确保IIS_USR具有对可执行文件夹的完全访问权限。
  5. 实施这些修补程序多次重启应用程序池和IIS本身
  6. 我现在不知道为什么这根本不会启动应用...当我第一次查看事件日志时,我看到应用程序会立即死掉代码1000:KERNELBASE.dll,这让我感到高兴在AnyCPU配置而不是X86修复...修复了事件日志条目,但应用程序仍然没有启动(任务管理器中没有任何内容),我在事件日志中没有错误...

    如果有人可以帮我解决这个问题,我会非常感激。这样我就可以从我网络上的任何设备(手机,平板电脑,笔记本电脑等)在我的主计算机上执行特定任务,而无需在我的主PC前面......

    更新

    对我的OP的评论,以及来自@Bradley Uffner的最终答案实际上已经解决了问题:我的" app"实际上是一个带有UI的桌面应用程序,为了运行该应用程序,IIS需要能够访问桌面和UI,就像是坐在PC前面的人一样。当然情况并非如此,因为IIS仅作为服务帐户运行,因此它不应该在后台启动UI程序。还可以看一下他解决这个问题的方法。

2 个答案:

答案 0 :(得分:3)

你最好的选择可能是尝试将其写成两部分。将命令发布到文本文件(或数据库或某些其他持久存储)的网站,以及定期轮询该文件(数据库等)以进行更改并执行这些命令的桌面应用程序。您可以写出整个命令行,包括exe path命令参数和开关。

这是我真正想到的唯一方法,允许像IIS这样的服务应用程序执行需要登录用户的桌面上下文的应用程序。

答案 1 :(得分:0)

您应该为具有足够高权限的技术用户分配正在运行的应用程序池。默认情况下,应用程序池使用ApplicationPoolIdentity identy运行,其权限非常低。