我们有一个内部页面,我想用它来运行一个可更新服务器上某些文件的可执行文件。换句话说,我不是每次需要手动运行此可执行文件时登录到服务器,而是希望从浏览器运行它。可执行文件在服务器上是自包含的,不与用户交互。
这是我的代码:
try
{
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = Server.MapPath(@"\iPhoneXMLCreator.exe");
p.StartInfo.WorkingDirectory = Server.MapPath(@"\");
p.StartInfo.RedirectStandardOutput = false;
p.Start();
p.WaitForExit();
lblResult.Text = "Success!";
}
catch (Exception ex)
{
lblResult.Text = "Oops, there was a problem.<br><Br>" + ex.Message;
}
当我运行它时,该过程显示在任务管理器中,但随后在几秒钟内退出而不更新它应该的文件。没有参数可以传递,只是一个简单的可执行文件。有什么想法吗?
答案 0 :(得分:5)
我首先检查运行Web应用程序的帐户是否具有适当的权限。
答案 1 :(得分:1)
这很可能是权限问题。由于它是执行此程序的Asp.Net运行时,因此您需要确保Asp.Net运行时使用的用户帐户可以访问此可执行文件,并修改由以下内容修改的任何资源(文件,数据库等)。可执行文件。
您可以通过模拟或授予相应帐户权限来执行此操作。正确的方法是使用假冒。
答案 2 :(得分:1)
在您自己登录的服务器上手动运行时,可执行文件是否运行并处理XML?
然后它可能是一个简单的权限问题,因为除非你冒充...它可能试图在ASPNET机器帐户下运行exe,这很可能没有XML所在文件夹的权限。只是基于您提供的信息的想法。
答案 3 :(得分:1)
你可以做的两件事:
尝试运行exe时运行Process Monitor。我已经多次使用它来帮助找到安全配置问题(特别是在Web服务器上)。它将记录每个io和注册表访问,更重要的是指示成功或失败。在此处获取:http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx无需设置。伟大的工具!
在控制台exe上重定向stdout。这将允许您捕获它尝试写入控制台的任何错误消息。以下是如何操作:
try
{
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = Server.MapPath(@"\iPhoneXMLCreator.exe");
p.StartInfo.WorkingDirectory = Server.MapPath(@"\");
// redirect stdout
p.StartInfo.RedirectStandardOutput = true;
var ConsoleOutput = new StringBuilder();
p.OutputDataReceived += (s, e) => ConsoleOutput.AppendLine(e.Data);
p.Start();
p.BeginOutputReadLine(); // if I remember correctly, you have to call Start() first or you get an exception
p.WaitForExit();
string output = ConsoleOutput.ToString();
lblResult.Text = "Success!";
}
catch (Exception ex)
{
lblResult.Text = "Oops, there was a problem.
" + ex.Message;
}
答案 4 :(得分:0)
使用一个间接级别并在您的网站和Exe之间放置一个缓冲区,而不是使用Exe的网站权限,只需在页面上将标记值设置为Web服务器上的文本文件代表Exe被击中。
在服务器上设置一个预定作业,每隔X小时或几分钟检查一次该标志值,或者只要看到该标志,就运行可执行文件。完成后重置标志/文件。这样就可以通过Web服务或其他机制检查标志,这样目标Exe甚至不需要在同一台Web服务器上。
只有在命中页面时不需要立即运行exe时,这才可行。
答案 5 :(得分:0)
好的,想通了。这是一个数据访问问题。 .exe的.config文件具有无效的数据库连接字符串。登录时为什么会有效,我不确定,但它现在有效。