【发布时间】: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 的用户很可能没有在给定目录中写入的权限。