【问题标题】:Process Start IIS Server进程启动 IIS 服务器
【发布时间】:2015-03-12 11:59:15
【问题描述】:

我无法从 IIS 成功调用 Process.Start("DocToPDF.exe", "file.docx file.pdf")

  • 我已尝试允许来自 IIS Admin Service 的桌面交互;
  • 我已尝试为包含 DocToPDF.exe 的目录授予 DefaultAppPool 完全控制权限

这些都不起作用。 DocToPDF.exe 以代码退出:1(我将退出代码写入文件......)。当我以调试模式 (F5) 运行网站时,程序以 code: 0 退出,一切正常。它在调试模式下运行良好。我的猜测是它与 IIS 权限或类似的东西有关,因为正如我所说,它在从 Visual Studio 启动应用程序时运行良好。

这是我正在使用的方法:

public byte[] DocToPdf(MemoryStream ms)
{            
    string fileName = Guid.NewGuid().ToString();
    string path = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\" + fileName + ".docx";
    string newPath = path.Replace("docx", "pdf");
    FileStream fs = new FileStream(path.ToString(), FileMode.OpenOrCreate);
    fs.Write(ms.ToArray(), 0, ms.ToArray().Length);
    fs.Close();

    Process p = new Process();
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.FileName = @"C:\Utils\OfficeToPDF.exe";
    p.StartInfo.Arguments = path + " " + newPath;
    p.Start();
    p.WaitForExit();
    System.IO.File.WriteAllText(@"C:\Utils\exitcode.txt", p.ExitCode.ToString());

    var bytes = System.IO.File.ReadAllBytes(newPath);

    System.IO.File.Delete(path);
    System.IO.File.Delete(newPath);

    return bytes;            
}

【问题讨论】:

  • 检查您的应用程序池身份 (iis.net/learn/manage/configuring-security/…)。它是否具有本地登录权限?它是否有权访问c:\utils 文件夹?它是否有权访问 %AppData% 文件夹?
  • 同意@jessehouwing - 这与您在应用程序池上使用的配置文件/用户帐户有关 - 它需要正确的权限。默认情况下,它是受限制的。您可能需要创建一个具有比标准 OOB 应用程序池用户帐户(我认为是 ApplicationIdentity)更多权限的用户帐户。它甚至可能没有执行进程的权限。
  • 同时检查您的应用程序池的位数和可执行文件的位数。
  • Read the output of the program 或者如果它支持的话,让它将错误记录到一个文件中。运行 IIS 的用户很可能没有在给定目录中写入的权限。

标签: c# iis


【解决方案1】:

从 IIS 网站/应用程序调用任何进程几乎总是一个可怕的想法。

  1. IIS 及其工作进程在会话 0 中运行。如果额外的可执行文件需要在用户会话中运行,则会话隔离可能会导致问题。 (很可能您遇到了这个问题,就好像可执行文件尝试使用打印驱动程序一样,它会在会话 0 下遇到问题。)
  2. IIS 工作进程在应用程序池标识下运行(如果您不更改池设置,则不会加载用户配置文件)。这种身份也可能导致失败,因为可执行文件可能需要普通用户帐户。

有太多的可执行文件无法在 IIS 下运行,所以你的并不是什么新鲜事或不常见的东西。

同时,当您在 Visual Studio 中按 F5 时,您的应用程序默认在 ASP.NET 开发服务器或 IIS Express 下运行,并且在您的用户会话中。切换到 IIS 时,那里的任何工作都可能中断。所以不要惊讶于你对 IIS/Windows 了解的很少。每个专家都是初学者。

典型的解决方法是找到 Microsoft 或第三方供应商支持或推荐的替代方法。请注意,免费和开源的东西通常在开发或测试时没有考虑到会话 0 的情况,它们可能会导致比您想象的更多的问题。

【讨论】:

    猜你喜欢
    • 2011-01-06
    • 1970-01-01
    • 2011-11-04
    • 2018-11-02
    • 1970-01-01
    • 2011-09-04
    • 2014-04-05
    相关资源
    最近更新 更多