我提前道歉,因为这是一个非常小众的问题,但希望有人对我有所帮助。
TL; DR:
在IIS8上,我有一个命令需要从需要管理权限的PHP exec()
或system()
函数执行。我需要一种方法来执行以下操作之一:
system()
/ exec()
运行命令,但不在脚本中存储计算机管理员密码好的,现在为血淋淋的细节。
背景
我正在用PHP编写一个Web应用程序,允许用户在开发过程中跟踪图形(图标)的开发并引用现有图形。它通过组合存储在MySQL数据库中的元数据和实际文件资源本身来实现这一点,这些资源存储在公司网络上的Team Foundation Server(TFS)集合中。
当用户通过我正在构建的Web应用程序更新文件时,需要执行以下过程:
这些以及其他TFS命令是通过TFS Command Line Utility,tf.exe
完成的。从服务器同步最新文件的命令示例如下:
tf.exe get /noprompt /login:"DOMAIN\username,password"
我有两个用户帐户可供使用:
我无法使用服务器管理员帐户(没有密码)或我的个人用户帐户,因为密码会定期过期,我不想在脚本中更新它。
问题:
当我从命令行(而不是通过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)
上运行答案 0 :(得分:0)
我明白了。我正在分享,因为这个答案可以在“非显而易见的信息”下的词典中找到
显然问题是PHP(在IIS下运行)执行这些命令为LOCAL \ IUSR,它没有管理员权限。我需要重新配置IIS,以便它将站点的应用程序池作为我的DOMAIN \ SVC帐户运行,该帐户具有适当的权限。但是,这仍然无效。
我不确定为什么,但缺少的部分是名为“加载用户配置文件”的应用程序池设置,需要将其设置为true。设置它工作正常后,虽然我找不到任何解释原因的文档。
实施修复的所有步骤:
DOMAIN\SVC
凭据。记录在案here和here。True
。
C:\Windows
并打开Temp
子目录的属性对话框。在安全标签下,将DOMAIN\SVC
帐户的R / W权限添加到C:\Windows\Temp
快速地说,“加载用户配置文件”设置仅在IIS 7.5+中实现,因此可能这对IIS 7.0及更早版本不起作用。