从网页运行exe

时间:2009-10-21 19:19:39

标签: c# asp.net executable

我们有一个内部页面,我想用它来运行一个可更新服务器上某些文件的可执行文件。换句话说,我不是每次需要手动运行此可执行文件时登录到服务器,而是希望从浏览器运行它。可执行文件在服务器上是自包含的,不与用户交互。

这是我的代码:

    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;
    }

当我运行它时,该过程显示在任务管理器中,但随后在几秒钟内退出而不更新它应该的文件。没有参数可以传递,只是一个简单的可执行文件。有什么想法吗?

6 个答案:

答案 0 :(得分:5)

我首先检查运行Web应用程序的帐户是否具有适当的权限。

答案 1 :(得分:1)

这很可能是权限问题。由于它是执行此程序的Asp.Net运行时,因此您需要确保Asp.Net运行时使用的用户帐户可以访问此可执行文件,并修改由以下内容修改的任何资源(文件,数据库等)。可执行文件。

您可以通过模拟或授予相应帐户权限来执行此操作。正确的方法是使用假冒。

http://msdn.microsoft.com/en-us/library/xh507fc5.aspx

答案 2 :(得分:1)

在您自己登录的服务器上手动运行时,可执行文件是否运行并处理XML?

然后它可能是一个简单的权限问题,因为除非你冒充...它可能试图在ASPNET机器帐户下运行exe,这很可能没有XML所在文件夹的权限。只是基于您提供的信息的想法。

答案 3 :(得分:1)

你可以做的两件事:

  1. 尝试运行exe时运行Process Monitor。我已经多次使用它来帮助找到安全配置问题(特别是在Web服务器上)。它将记录每个io和注册表访问,更重要的是指示成功或失败。在此处获取:http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx无需设置。伟大的工具!

  2. 在控制台exe上重定向stdout。这将允许您捕获它尝试写入控制台的任何错误消息。以下是如何操作:

  3. 
    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文件具有无效的数据库连接字符串。登录时为什么会有效,我不确定,但它现在有效。