用于除PHP用户

时间:2017-07-20 00:53:59

标签: php iis cmd permissions application-pool

我提前道歉,因为这是一个非常小众的问题,但希望有人对我有所帮助。

TL; DR:

在IIS8上,我有一个命令需要从需要管理权限的PHP exec()system()函数执行。我需要一种方法来执行以下操作之一:

  • 作为管理用户从system() / exec()运行命令,但不在脚本中存储计算机管理员密码
  • 允许一个特定的可执行文件在没有管理权限的情况下在我的系统上运行,无需修改可执行文件。

好的,现在为血淋淋的细节。

背景

我正在用PHP编写一个Web应用程序,允许用户在开发过程中跟踪图形(图标)的开发并引用现有图形。它通过组合存储在MySQL数据库中的元数据和实际文件资源本身来实现这一点,这些资源存储在公司网络上的Team Foundation Server(TFS)集合中。

当用户通过我正在构建的Web应用程序更新文件时,需要执行以下过程:

  • TFS集合的最新副本将同步到本地服务器工作区
  • 从TFS
  • 中检出要编辑的文件
  • 新文件将移至TFS工作区,根据需要更改/覆盖现有文件
  • 已编辑的文件已签入TFS

这些以及其他TFS命令是通过TFS Command Line Utilitytf.exe完成的。从服务器同步最新文件的命令示例如下:

tf.exe get /noprompt /login:"DOMAIN\username,password"

我有两个用户帐户可供使用:

  1. 在服务器上拥有管理权限的域名服务帐户,此处我将其称为" DOMAIN \ SVC"
  2. 内置服务器本地IIS帐户," LOCAL \ IUSR"
  3. 我无法使用服务器管理员帐户(没有密码)或我的个人用户帐户,因为密码会定期过期,我不想在脚本中更新它。

    问题:

    当我从命令行(而不是通过PHP脚本)运行tf.exe作为DOMAIN \ SVC或LOCAL \ IUSR(使用Windows命令Runas)时,我遇到了一个可爱的UAC挑战请求管理员权限。如果我允许它,它会按照我的意愿执行,没有任何问题。但是,当我运行以下PHP脚本时,它会打印array() 1,表示失败:

    <?php
    
      $var = null;
      $array = [];
    
      // Note the double backslash in the /login flag to escape the PHP escape character
      exec('cd "Path/to/TFS/workspace" && tf.exe get /noprompt /login:"DOMAIN\\SVC,password"', $array, $var);
    
      print_r($array);
      echo $var;
    
    ?>
    

    我将上面的命令拉出来并从命令行手动测试它并且它工作正常,除了UAC提示符。

    我已经更改了由IIS管理的PHP应用程序,因此它作为DOMAIN \ SVC帐户运行,该帐户在服务器上具有管理员权限。然而,尽管它具有适当的凭据,它仍然会弹出“#”; UAC窗口因此失败;可能是由于许可问题。

    因此,回顾一下,我需要一种让tf.exe运行而不需要管理员权限的方法,或者允许PHP运行自动提升命令的方法。

    注意:我不能使用Runas,因为Runas不允许将密码作为输入传递给它。这是设计的,据我所知,无法克服

    此系统在Windows Server 2012 R2,IIS 8.5,PHP 7.1.1(x64)

    上运行

1 个答案:

答案 0 :(得分:0)

我明白了。我正在分享,因为这个答案可以在“非显而易见的信息”下的词典中找到

显然问题是PHP(在IIS下运行)执行这些命令为LOCAL \ IUSR,它没有管理员权限。我需要重新配置IIS,以便它将站点的应用程序池作为我的DOMAIN \ SVC帐户运行,该帐户具有适当的权限。但是,这仍然无效。

我不确定为什么,但缺少的部分是名为“加载用户配置文件”的应用程序池设置,需要将其设置为true。设置它工作正常后,虽然我找不到任何解释原因的文档。

实施修复的所有步骤:

  • 在IIS管理器中,选择服务器项“应用程序池”,然后右键单击您的网站使用的池,并选择“高级设置”。在此列表中,更改以下设置:
    1. 修改身份,选择“自定义帐户”并输入DOMAIN\SVC凭据。记录在案herehere
    2. 加载用户个人资料设置为True
  • 在IIS管理器中,打开网站的身份验证功能。右键单击“匿名身​​份验证”并选择“编辑”,然后将其设置为“应用程序池标识”。
  • 在Windows资源管理器中,导航到C:\Windows并打开Temp子目录的属性对话框。在安全标签下,将DOMAIN\SVC帐户的R / W权限添加到C:\Windows\Temp
    • 注意:这可让服务帐户访问PHP临时文件

快速地说,“加载用户配置文件”设置仅在IIS 7.5+中实现,因此可能这对IIS 7.0及更早版本不起作用。