【问题标题】:Run exe from webpage从网页运行exe
【发布时间】:2009-10-21 19:19:38
【问题描述】:

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

这是我的代码:

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

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

【问题讨论】:

  • 好的,想通了。这是一个数据访问问题。 .exe 的 .config 文件包含无效的数据库连接字符串。为什么登录时它会起作用,我不确定,但它现在起作用了。

标签: c# asp.net executable


【解决方案1】:

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

【讨论】:

  • 如果没有 IO 访问,进程会不会失败?所有权限设置正确。
  • 可以访问exe,但是如果要更新的文件位于不同的目录中,可能会导致问题。
  • 刚刚给了每个人完全的权限,但仍然没有。
  • 这个我没试过,但你可能想看看这里:daniweb.com/forums/thread132773.html
【解决方案2】:

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

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

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

【讨论】:

  • 哈哈,虽然我打字很快!很高兴看到我们中的一些人之前曾被 ASPNET 帐户/权限烧毁:)
【解决方案3】:

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

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

【讨论】:

  • 是的,它还使用 NETWORKSERVICE 帐户作为计划进程运行。这是在 IIS7 上,我相信它使用 NETWORKSERVICE 作为 IIS 的默认用户,对吧?
【解决方案4】:

你可以做的两件事:

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

  2. 在您的控制台 exe 上重定向标准输出。这将允许您捕获它试图写入控制台的任何错误消息。操作方法如下:

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

【讨论】:

  • 没有从 ProcMon 那里得到任何明确的帮助,使用第二个想法也没有输出。
  • 没有明确的帮助是什么意思?你在 ProcMon 中找到你的进程了吗?它有没有为你的 exe 捕获任何东西? exe是否正常输出任何东西(即使它成功了?奇怪的是它根本没有捕获任何控制台输出。这个问题没有多少线索,是吧?你有没有尝试输出映射路径以确保它们是对吗?
【解决方案5】:

与使用 Exe 的网站权限相比,一种使用间接级别并在您的网站和 Exe 之间放置缓冲区的解决方法是在页面出现时简单地将标志值设置到 Web 服务器上的文本文件中代表Exe被击中。

在服务器上设置一个计划作业,以每 X 小时或每分钟检查一次该标志值,或者在看到标志时运行可执行文件。完成后重置标志/文件。这为通过 web 服务或其他机制检查标志提供了可能性,这样目标 Exe 甚至不需要在同一台 web 服务器上。

这只有在 exe 不需要在页面被点击时立即运行时才可行。

【讨论】:

    【解决方案6】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-06
      • 2018-11-28
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多