繁体   English   中英

从网页运行exe

[英]Run exe from webpage

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

这是我的代码:

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

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

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

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

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

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

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

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

你可以做的2件事:

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

  2. 在控制台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; }

而不是使用Exe的网站权限,使用间接级别并在网站和Exe之间放置缓冲区的一种解决方法是在表示Exe的页面时将标记值设置为Web服务器上的文本文件被打了。

在服务器上设置一个预定作业,每隔X小时或几分钟检查一次该标志值,或者只要看到该标志,就运行可执行文件。 完成后重置标志/文件。 这样就可以通过Web服务或其他机制检查标志,这样目标Exe甚至不需要在同一个Web服务器上。

只有在命中页面时不需要立即运行exe时,这才可行。

好吧,想通了。 这是一个数据访问问题。 .exe的.config文件具有无效的数据库连接字符串。 登录后为什么会有效,我不确定,但它现在有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM