我正在尝试从网页的后端代码/应用程序池启动流程。这个过程将启动我自己构建的应用程序。
出于某种原因,当我从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.";
}
以下是我尝试解决此问题的事项:
ProcessStartInfo
相同的帐户(SomeUsername)下运行。我现在不知道为什么这根本不会启动应用...当我第一次查看事件日志时,我看到应用程序会立即死掉代码1000:KERNELBASE.dll,这让我感到高兴在AnyCPU配置而不是X86修复...修复了事件日志条目,但应用程序仍然没有启动(任务管理器中没有任何内容),我在事件日志中没有错误...
如果有人可以帮我解决这个问题,我会非常感激。这样我就可以从我网络上的任何设备(手机,平板电脑,笔记本电脑等)在我的主计算机上执行特定任务,而无需在我的主PC前面......
更新
对我的OP的评论,以及来自@Bradley Uffner的最终答案实际上已经解决了问题:我的" app"实际上是一个带有UI的桌面应用程序,为了运行该应用程序,IIS需要能够访问桌面和UI,就像是坐在PC前面的人一样。当然情况并非如此,因为IIS仅作为服务帐户运行,因此它不应该在后台启动UI程序。还可以看一下他解决这个问题的方法。
答案 0 :(得分:3)
你最好的选择可能是尝试将其写成两部分。将命令发布到文本文件(或数据库或某些其他持久存储)的网站,以及定期轮询该文件(数据库等)以进行更改并执行这些命令的桌面应用程序。您可以写出整个命令行,包括exe path命令参数和开关。
这是我真正想到的唯一方法,允许像IIS这样的服务应用程序执行需要登录用户的桌面上下文的应用程序。
答案 1 :(得分:0)
您应该为具有足够高权限的技术用户分配正在运行的应用程序池。默认情况下,应用程序池使用ApplicationPoolIdentity identy运行,其权限非常低。