PHP PHP 用户以外的用户的 exec() 命令函数

PHP exec() command function for user other than PHP user

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

TL;DR:

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


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

背景:

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

当用户通过我正在构建的网络应用程序更新文件时,需要发生以下过​​程:

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

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

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

  1. 在服务器上具有管理权限的域服务帐户,这里我称之为"DOMAIN\SVC"
  2. 内置服务器本地 IIS 帐户,"LOCAL\IUSR"

我无法使用服务器管理员帐户(没有密码)或我的个人用户帐户,因为密码会定期过期,我不想在脚本中更新它。

问题:

当我从命令行 运行 tf.exe(不是通过 PHP 脚本)作为 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 帐户,该帐户在服务器上具有管理员权限。但是,尽管它具有适当的凭据,它仍然 'pops up' UAC window 并因此失败;大概是由于权限问题。

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

注意:我不能使用 运行as,因为 运行as 不允许通过管道将密码作为输入输入。这是设计使然,据我所知,无法克服


此系统 运行正在 Windows Server 2012 R2、IIS 8.5、PHP 7.1.1 (x64)

上运行

我明白了。我分享是因为这个答案可能会出现在 "Non-Obvious Information"

下的字典中

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

我不确定为什么,但缺少的部分是一个名为 "Load User Profile" 的应用程序池设置,需要将其设置为 true。设置后它工作正常,虽然我在任何地方都找不到任何解释原因的文档。

实施修复的所有步骤:

  • 在 IIS 管理器中,select 服务器项 "Application Pools",然后右键单击您网站使用的池,然后 select "Advanced Settings"。在此列表中,更改以下设置:
    1. 编辑 Identity,选择 "Custom Account" 并输入 DOMAIN\SVC 凭据。这已记录在案 here and here
    2. 加载用户配置文件设置为True
  • 在 IIS 管理器中,打开您网站的 身份验证 功能。右键单击 "Anonymous Authentication" 并选择 "Edit",然后将其设置为 "Application Pool Identity"。
  • 在 Windows 资源管理器中,导航到 C:\Windows 并打开 Temp 子目录的属性对话框。在 安全 选项卡下,将 DOMAIN\SVC 帐户的 R/W 权限添加到 C:\Windows\Temp
    • 注意: 这允许服务帐户访问 PHP 临时文件

顺便说一句,"Load User Profile" 设置仅在 IIS 7.5+ 中实现,因此大概这不适用于 IIS 7.0 及更早版本。