我有一个使用在IIS中的Windows Server 2012 R2上运行的PHP脚本的站点。我试图使用fopen来读取我们网络中另一台服务器上的文件但是遇到了问题。我能够使用fopen命令在本地服务器上打开文件并使用PHP CLI,我可以在远程服务器上成功打开文件。
但是,当我尝试使用浏览器通过网站处理它时,它失败并显示错误:
"未能打开流:权限被拒绝"
在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!");
更新:所以我在CLI和浏览器上运行了shell_exec(" whoami")。当我在CLI中执行此操作时,它会显示我正在运行shell的域帐户。但是,当我通过浏览器运行脚本时,它会显示" nt authority \ iusr"。任何想法如何让它在不同的用户下运行?在IIS中更改应用程序池标识似乎与我在测试中的内容没有区别。
echo shell_exec("whoami");
答案 0 :(得分:3)
好的,我能够解决这个问题。我不得不进入IIS> FastCGI设置>选择我的PHP应用程序>点击右侧边栏上的修改>展开高级菜单>将协议从NamedPipe更改为Tcp。
我遇到这种情况的方式是我在另一台运行PHP的Windows Server上进行了测试,它使用的是AppPool中设置的正确帐户/身份。所以我在我的服务器上设置了一个新网站进行测试,我甚至无法运行 echo shell_exec(" whoami");当我开始对其进行故障排除时,我遇到了这个网站:http://tech.trailmax.info/2012/12/php-warning-shell_exec-unable-to-execute-on-iis-7/
我遵循了这些步骤,不仅解决了我的问题,无法运行shell_exec,还开始使用我在IIS AppPool中设置的域帐户运行我的PHP脚本。现在我的fopen按预期工作了。
答案 1 :(得分:0)
正如php manual所说,你应该使用\\ localservername \ c $ \ inetpub \ wwwroot \ test.html
但是因为它是一个用于逃避其他特殊字符的保留字符,你应该将\的数量增加一倍:
fopen("\\\\localservername\\c$\\inetpub\\wwwroot\\test.html", "w") or die("Can't open file!");
如果它不起作用,您应该检查运行php脚本的网络服务器用户是否具有访问该资源所需的权限。
管理共享(驱动器+ $)通常只允许管理员使用。
恕我直言,最好使用网络服务器用户的权限创建共享文件夹,而不是使用管理共享(c $)