PHP PHP 用户以外的用户的 exec() 命令函数
PHP exec() command function for user other than PHP user
我提前道歉,因为这是一个非常小众的问题,但希望有人能帮助我。
TL;DR:
在 IIS8 上,我有一个命令需要从 PHP exec()
或 system()
函数执行,需要管理权限。我需要一种方法来执行以下操作之一:
- 运行 来自
system()
/exec()
作为管理用户的命令,未在脚本中存储计算机管理员密码
- 允许一个特定的可执行文件 运行 在我的系统上没有管理权限,不修改可执行文件。
好的,现在是血淋淋的细节。
背景:
我正在 PHP 中编写一个 Web 应用程序,允许用户跟踪图形(图标)的开发并在开发过程中引用现有图形。它通过将存储在 MySQL 数据库中的元数据与存储在公司网络上的 Team Foundation Server (TFS) 集合中的实际文件资源本身相结合来实现这一点。
当用户通过我正在构建的网络应用程序更新文件时,需要发生以下过程:
- TFS 集合的最新副本已同步到本地服务器工作区
- 要编辑的文件已从 TFS 签出
- 新文件被移动到 TFS 工作区,changing/overwriting根据需要移动现有文件
- 编辑后的文件被签入TFS
这些以及其他 TFS 命令是通过 TFS Command Line Utility、tf.exe
完成的。从服务器同步最新文件的命令示例如下:
tf.exe get /noprompt /login:"DOMAIN\username,password"
我有两个用户帐户可以使用:
- 在服务器上具有管理权限的域服务帐户,这里我称之为"DOMAIN\SVC"
- 内置服务器本地 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"。在此列表中,更改以下设置:
- 编辑 Identity,选择 "Custom Account" 并输入
DOMAIN\SVC
凭据。这已记录在案 here and here。
- 将加载用户配置文件设置为
True
。
- 注意: 如果遇到 "keyset does not exist" 错误,请参阅此 MS support article
- 在 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 及更早版本。
我提前道歉,因为这是一个非常小众的问题,但希望有人能帮助我。
TL;DR:
在 IIS8 上,我有一个命令需要从 PHP exec()
或 system()
函数执行,需要管理权限。我需要一种方法来执行以下操作之一:
- 运行 来自
system()
/exec()
作为管理用户的命令,未在脚本中存储计算机管理员密码 - 允许一个特定的可执行文件 运行 在我的系统上没有管理权限,不修改可执行文件。
好的,现在是血淋淋的细节。
背景:
我正在 PHP 中编写一个 Web 应用程序,允许用户跟踪图形(图标)的开发并在开发过程中引用现有图形。它通过将存储在 MySQL 数据库中的元数据与存储在公司网络上的 Team Foundation Server (TFS) 集合中的实际文件资源本身相结合来实现这一点。
当用户通过我正在构建的网络应用程序更新文件时,需要发生以下过程:
- TFS 集合的最新副本已同步到本地服务器工作区
- 要编辑的文件已从 TFS 签出
- 新文件被移动到 TFS 工作区,changing/overwriting根据需要移动现有文件
- 编辑后的文件被签入TFS
这些以及其他 TFS 命令是通过 TFS Command Line Utility、tf.exe
完成的。从服务器同步最新文件的命令示例如下:
tf.exe get /noprompt /login:"DOMAIN\username,password"
我有两个用户帐户可以使用:
- 在服务器上具有管理权限的域服务帐户,这里我称之为"DOMAIN\SVC"
- 内置服务器本地 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"。在此列表中,更改以下设置:
- 编辑 Identity,选择 "Custom Account" 并输入
DOMAIN\SVC
凭据。这已记录在案 here and here。 - 将加载用户配置文件设置为
True
。- 注意: 如果遇到 "keyset does not exist" 错误,请参阅此 MS support article
- 编辑 Identity,选择 "Custom Account" 并输入
- 在 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 及更早版本。