我一直致力于解决从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构造函数重载时,我看到在用户创建它时,需要一个域(For:LDAP?,ASP?,测试结果相同)。但是,在Windows 7开发环境,2008或20012服务器中通过taskman观察时,此配置不允许(我观察)IE进程启动。
要定义问题,我可以撤消所有注释,但它会失败。我可以按原样运行,它不会失败。我只能取消注释UseShellExecute,它会失败,就像我还包括用户名和密码一样。当我在Visual Studio调试中观察ProcessStartInfo时,我看到了正确的值。
所以,我想我有几个相关的问题,沸腾到:“OMG!plz帮助服务器移动”。为什么在没有定义UseShellExecute = false或UserName / Password / Domain组合的情况下,该过程在Server 2008中正常启动,但如果我完全不知道默认值为true / NullOrEmpty,则会成功。
接下来是,我是否需要为我的新管理员用户定义任何其他权限,我将使用这些权限来允许在Windows 2008或2012服务器下进行此操作?管理员用户是否需要在其运行的路径或类似的路径上定义权限,因为管理员组权限已被削弱? (我错误地认为我可以测试具有更高安全性设置的Windows 7并且它会在这里失败,但是不存在,通过API为两种环境清楚地提供,因为它编译和所有?)
这个进程是否可能是shell启动,但是没有完成,并且它隐藏在应用程序池的工作进程中,我需要考虑apppools?
当然,我也不欢迎任何可能有帮助的事情。
答案 0 :(得分:0)
这不起作用的原因是IIS没有足够的权限来执行命令。 IIS不应该具有权限。
我们改为编写了一个与预定任务协同工作的小型控制台应用程序。该任务运行溃败。控制台应用程序监视系统并能够杀死不良进程,因此下一次运行良好进程。
计划任务允许我在具有适当权限的特定用户下启动进程。 控制台应用程序允许我观察过程,并在任务出错或无法完成时进行清理。任务调度程序永远不会返回完成的代码。启动选项卡式浏览器会生成您将要查看的窗口的父级。杀死标签永远不会破坏父母。控制台应用程序可以。
在后台网站上,我本可以在控制台应用程序中完成所有操作,但它是一种自我发展的动物,我打算简化它。