【发布时间】:2015-08-29 02:31:40
【问题描述】:
大约一周以来,我一直在处理将代码从 Windows Server 2008 迁移到 2012 的问题。我进行了大量搜索,但没有解决我看到的问题。
我正在开发一个网络应用程序,该应用程序是从最近离开公司的另一位开发人员手中接手的。该应用程序使用 fabric.js 来允许用户操作画布。后来,它通过将画布渲染为 base64 字符串,将其转换为 .Net 中的图像,然后通过 iTextSharp 将图像添加到 PDF 中来制作 PDF。
由于此过程可能需要一段时间,(计划在较大的页面集中完成)并且会干扰用户,并且可能在客户端浏览器的单独选项卡中发生的责任太大,所以最初的开发人员提出了使用从数据库中提取画布数据的方法,然后以所需的页面尺寸和比例重建画布,以便通过 IE 在服务器上打印。
因此,.Net 代码使用 URL 参数启动 IE 进程,该参数将 IE 打开到原始编辑器在其中更改的同一页面。浏览器的此实例在服务器上打开,并带有允许它获取打印模式下所需的数据以进行全尺寸文档渲染。浏览器渲染页面并生成 base64 图像字符串,设置为隐藏字段,然后发送回服务器以处理成 PDF。该过程通过 AJAX 启动,服务器使用 PDF 的 URL 进行确认。浏览器通过 JavaScript 重定向到该文档。
老实说,这一切对我来说似乎很麻烦,但我没有更好的想法,而且它确实在我们的暂存服务器上工作。
本周,决定将最新版本移至客户端新服务器。虽然我们的暂存服务器运行的是 Windows 2008 Server,但新的服务器是 2012。这就是问题的开始。
它正在使用以下(某种,稍后解释)打开进程 (*注意:userAccount 是通过一个简单的函数获得的,该函数使用 SecureString 和已知良好的 UserName 值填充动态 ExpanoObject。):
String path = Environment.ExpandEnvironmentVariables(@"%PROGRAMFILES%\Internet Explorer\iexplore.exe");
ProcessStartInfo startInfo = new ProcessStartInfo()
{
//FileName = "IEXPLORE",
FileName = path,
Arguments = "https://www.google.com",//REAL URL REMOVED
//Password = (userAccount.password as SecureString),
//UserName = userAccount.account.ToString(),
//Domain = "MYCURRENTDOMAIN",//REAL DOMAIN REMOVED
//UseShellExecute = false,
//RedirectStandardOutput = true
};
我在服务器上看到的是这段代码直接运行,没有启动进程。没有错误,观察服务器进程显示 IE 没有打开,即使我故意将它挂在 using 语句中。我的假设是 IIS 用户没有启动桌面应用程序的权限,并且它默默地失败了。这导致我添加注释代码。
在我在 2012 服务器上进行测试之前,我决定应该为测试创建一个本地用户。授予他们管理员权限,然后尝试通过该用户以“提升”权限启动 IE,假设该进程未在 2012 服务器上启动的原因是更严格的安全环境。 当我添加用户名和密码时,该过程错误地说如果声明用户,我需要将 UseShellExecute 设置为 false。当我检查 ProcessStartInfo 构造函数重载时,我看到当用户创建它时,需要一个域(对于:LDAP?ASP?,测试结果相同)。但是,当在 Windows 7 开发环境、2008 或 20012 服务器中通过 taskman 观察时,此配置不允许(我观察到)IE 进程启动。
要定义问题,我可以撤消所有 cmets,但它会失败。我可以按原样运行,它不会失败。我只能取消注释 UseShellExecute 并且它会失败,就像我还包括用户名和密码一样。当我在 Visual Studio 调试中观察 ProcessStartInfo 时,我看到了正确的值。
所以,我想我有几个相关的问题,归结为:“OMG!请帮助服务器移动”。为什么在没有定义 UseShellExecute = false 或 UserName/Password/Domain 组合的情况下,该过程在 Server 2008 中开始正常,但如果我根本不解决它,知道默认值分别为 true/NullOrEmpty,就会成功。
接下来,我是否需要为我的新管理员用户定义任何额外的权限,我将使用该用户的凭据来允许在 Windows 2008 或 2012 服务器下发生这种情况?管理员用户是否需要在其操作路径上定义权限或类似的权限,因为管理员组权限被削弱了? (假设我可以使用更高的安全设置测试 Windows 7 并且它会在此处失败,但不会在此处失败,我认为这是通过两种环境的 API 清楚地提供的,因为它编译和所有,我是错误的吗?)
有没有可能这个进程,不是shell启动,正在启动,但没有完成,并且它隐藏在应用程序池的工作进程中,我需要考虑应用程序池?
当然,任何我认为可能有用的东西也是受欢迎的。
【问题讨论】:
-
我能够在不调用打开进程的情况下解决这个特定问题。相反,我将使用计划任务在站点内打开一个 aspx 文件。我创建了一个将从数据库中读取并处理渲染计划的页面。它的负载抓取处理作业所需的数据并将其置于会话中。然后它将包发布到自己并处理实际渲染。图像被存储,从中创建 pdf,然后在 IIS 中全部删除。我没有回答我自己的问题,因为我仍然想了解为什么这不起作用。感谢您的帮助。
-
有趣的是,我刚刚发现了这篇文章。这不完全是我的问题,但更相似:stackoverflow.com/questions/32384234/…
标签: sql sql-server windows-server-2008-r2 windows-server-2012