【问题标题】:Starting Process from IIS as Admin User以管理员用户身份从 IIS 启动进程
【发布时间】: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


【解决方案1】:

这不起作用的原因是 IIS 没有获得足够的权限来执行命令。 IIS 应该没有权限。

相反,我们编写了一个与计划任务协同工作的小型控制台应用程序。任务运行路线。控制台应用程序监控系统并能够杀死不良进程,以便下次运行良好的进程。

计划任务允许我在具有适当权限的特定用户下启动进程。 控制台应用程序允许我观察过程,并在任务出错或无法完成时进行清理。任务调度程序永远不会取回已完成的代码。启动选项卡式浏览器会生成您将查看的窗口的父级。杀死标签永远不会破坏该父级。控制台应用程序可以。

在后台,我本可以在控制台应用程序中完成这一切,但它是一种自我成长的动物,我打算简化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多