我正在尝试从网页的后端代码/应用程序池启动一个进程。这个过程将启动我自己创建的应用程序。
由于某些原因,该进程只在我从VS2013启动它时才能工作/运行。当我从IIS(7.5)本身启动它时,它从未起作用。
我在Windows 7机器上( IIS主机和App ),我已经将我的网站设置为只能通过内部网络访问。
下面是代码,后面是配置/尝试修复这个问题:
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前。
更新
对我的操作的评论,以及@Bradley Uffner的最终回答实际上解决了这个问题:我的“应用程序”实际上是一个带有UI的桌面应用程序,为了运行该应用程序,IIS需要能够访问桌面和UI,就像坐在PC前的人一样。当然,情况并非如此,因为IIS只是作为一个服务帐户运行,因此它不应该在后台启动UI程序是有意义的。也可以看到他的答案,因为有一种方法可以绕开这条路。
发布于 2014-10-20 03:27:04
你最好的选择是试着把它写成两部分。将命令发布到文本文件(或数据库或其他持久性存储)的网站,以及定期轮询该文件(数据库等)并执行这些命令的桌面应用程序。您可以写出整个命令行,包括exe路径命令参数和开关。
这是唯一能让IIS这样的服务应用程序执行需要具有登录用户的桌面上下文的应用程序的方法。
发布于 2014-10-20 03:33:28
您应该为运行中的应用程序池分配具有足够高私密性的技术用户。默认情况下,应用程序池使用的是ApplicationPoolIdentity identy,它的私有度非常低。
https://stackoverflow.com/questions/26457757
复制相似问题