我有一个网站使用在IIS中的Windows Server 2012 R2上运行的PHP脚本。我正尝试使用fopen来读取网络中另一台服务器上的文件,但遇到问题。我可以使用fopen命令打开本地服务器上的文件并使用PHP CLI,我可以在远程服务器上成功打开文件。PHP无法打开网络文件
然而,当我尝试使用我的浏览器通过该网站处理它,它失败,出现错误:
"failed to open stream: Permission denied"
在IIS中,我创建了一个新的应用程序池,并设置其身份以域管理员,其有管理员访问这两个服务器,但这似乎没有帮助。这与我在运行CLI时使用的帐户相同。
下面是我用我的PHP脚本代码:
fopen("//remoteservername/c$/inetpub/wwwroot/test.html", "w") or die("Can't open file!");
我用反斜杠(与逃脱之辈)尝试。我试过在路径前面使用FILE://。我试图将远程服务器的驱动器映射到运行PHP的Web服务器,并使用Y:\ inetpub之类的路径...我试过使用“rb”而不是“w”,因为它们都是Windows服务器。
我觉得它与网站运行的帐户/身份有关,但我不确定它为什么在我改变它后仍然不能工作。
更新:我提到的fopen作品读取本地服务器上的文件,但它似乎如果我使用如下的相对路径是唯一真正的...
fopen("test.html", "w") or die("Can't open file!");
如果我尝试打开的是同一个文件本地服务器使用如下所示的绝对路径,它失败。所以我不相信了它的身份问题......
fopen("//localservername/c$/inetpub/wwwroot/test.html", "w") or die("Can't open file!");
更新:所以,我跑了shell_exec同时在CLI和通过浏览(“WHOAMI”)。当我在CLI中执行它时,它会显示我正在运行shell的域帐户。但是,当我通过浏览器运行脚本时,它显示“nt authority \ iusr”。任何想法如何让它在不同的用户下运行?在IIS中更改应用程序池标识似乎与我在测试中可以看到的不同。
echo shell_exec("whoami");
如果有任何帮助,很久以前我就与PHP/IIS和网络驱动器进行了斗争。该网站的管理员/开发人员发现不同用户报告的行为不一致。这是一个使用NTLM进行身份验证的Intranet应用程序。我们唯一能够解释这种行为的合理解释是,PHP代码是通过NTLM(erk!)提供的权限运行的。我们从未完全验证过这一点。 – symcbean