2016-12-27 92 views
0

我有一个网站使用在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"); 
+0

如果有任何帮助,很久以前我就与PHP/IIS和网络驱动器进行了斗争。该网站的管理员/开发人员发现不同用户报告的行为不一致。这是一个使用NTLM进行身份验证的Intranet应用程序。我们唯一能够解释这种行为的合理解释是,PHP代码是通过NTLM(erk!)提供的权限运行的。我们从未完全验证过这一点。 – symcbean

回答

2

OK我能把这个解决的权限。我必须进入IIS> FastCGI设置>选择我的PHP应用程序>单击右侧的编辑>展开高级菜单>将协议从NamedPipe更改为Tcp。

我遇到这种情况的方式是我在另一台运行PHP的Windows服务器上进行了测试,并且它使用了在AppPool中设置的正确帐户/标识。所以我在我的服务器上安装一个新的站点来测试,我甚至不能运行 echo shell_exec(“whoami”);当我开始排除故障时,我遇到了这个网站:http://tech.trailmax.info/2012/12/php-warning-shell_exec-unable-to-execute-on-iis-7/

我遵循这些步骤,不仅解决了我的问题,无法运行shell_exec,而且还开始使用我设置的域帐户运行我的PHP脚本IIS AppPool。现在我的fopen按预期工作。

+1

哇,我认为这只是帮助我的时间。我一直在用一个Web应用程序挣扎了好几天,这个应用程序在UNC共享上扮演着文件管理员的角色。如果我有IIS匿名访问,它的工作完美,但我需要以某种方式阻止用户的网络用户名(只是为了记录谁做了什么,真的)。所以,我关闭了匿名功能,但启用了Windows身份验证。当试图在UNC共享上创建一个新文件时,fopen会失败。但是执行这个小技巧似乎已经解决了这个问题。谢谢 !! – DaveyBoy

0

由于php manual说,你应该使用\\ localservername \ C $ \的Inetpub \ wwwroot的\ test.html的

但随着\这是一个逃跑的保留字符其他特殊字符,你应该加倍数像这样的\:如果它不工作

fopen("\\\\localservername\\c$\\inetpub\\wwwroot\\test.html", "w") or die("Can't open file!"); 

,你应该检查,如果它的运行PHP脚本web服务器的用户有权限即可访问该资源。

管理共享(drive + $)通常只允许管理员使用。

恕我直言,它应该是最好创建一个共享文件夹与网络服务器的用户,而不是使用管理共享(C $)

+0

我提到在我原来的帖子中尝试反斜杠,包括像你的例子一样的额外的。我使用whoami和get_current_user()检查了当前用户,并且它显示它正在“NT Authority \ IUSR”下运行,即使我的IIS网站使用以域帐户作为其身份的应用程序池。我认为这是问题,但不知道如何解决它。我试着给IUSR完全访问test.html文件,但它没有改变。而且我知道我使用的是管理共享,但也测试过在服务器上创建共享,就像您所建议的那样,但仍然没有任何变化。任何其他想法?谢谢 – Sina

+0

以下是PHP错误日志显示的内容。第一个示例是尝试使用C $管理共享进行访问。第二个例子是使用我创建并分配权限的名为“test”的共享文件夹。 [28-Dec-2016 08:14:00 America/Los_Angeles] PHP警告:fopen(\\ localservername \ c $ \ inetpub \ wwwroot \ test.html):无法打开流:权限在C:\ inetpub中被拒绝\ wwwroot \ test.php on line 100 [28-Dec-2016 08:15:09 America/Los_Angeles] PHP警告:fopen(\\ localservername \ test \ test.html):无法打开流:权限被拒绝在线100上的C:\ inetpub \ wwwroot \ test.php – Sina

+0

很明显,这是权限问题。您是否尝试向共享上的“所有”用户添加完整权限,仅用于测试?此外,我认为NT Authority \ IUSR它是一个本地用户,它只能在IIS机器上工作。它不是域用户,所以它不会在另一台机器上拥有权限。您应该编辑池并使用非本地帐户,您将在第二台机器上为其添加权限。 – NetVicious