PHP 无法打开网络文件
PHP Can't Open Network File
我有一个站点在 IIS 的 Windows Server 2012 R2 上使用 PHP 脚本 运行ning。我正在尝试使用 fopen 读取我们网络中另一台服务器上的文件,但遇到了问题。我可以使用 fopen 命令打开本地服务器上的文件,使用 PHP CLI,我可以成功打开远程服务器上的文件。
但是,当我尝试使用我的浏览器通过网站处理它时,它失败并显示错误:
"failed to open stream: Permission denied"
在 IIS 中,我创建了一个新的应用程序池并将其身份设置为域管理员,它对两台服务器都具有管理员访问权限,但这似乎没有帮助。这与我 运行 CLI 工作时使用的帐户相同。
这是我正在使用的 PHP 脚本代码:
fopen("//remoteservername/c$/inetpub/wwwroot/test.html", "w") or die("Can't open file!");
我试过使用反斜杠(也有转义的)。我试过在路径前使用 FILE:// 。我试过将远程服务器的驱动器映射到 Web 服务器 运行ning PHP 并使用像 Y:\inetpub 这样的路径...我试过使用 "rb" 而不是 "w" 因为它们都是 Windows 服务器。
我觉得这与网站 运行 所在的 account/identity 有关,但我不确定为什么在我更改后它仍然无法正常工作。
更新:我提到过 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");
正如 php manual 所说,您应该使用 \\localservername\c$\inetpub\wwwroot\test.html
但是因为 \ 它是用于转义其他特殊字符的保留字符,所以您应该像这样将 \ 的数量加倍:
fopen("\\localservername\c$\inetpub\wwwroot\test.html", "w") or die("Can't open file!");
如果它不起作用您应该检查运行 php 脚本的网络服务器的用户是否具有访问所需的权限该资源。
管理共享(驱动器 + $)通常只允许管理员使用。
恕我直言,最好创建一个具有网络服务器用户权限的共享文件夹,而不是使用管理共享 (c$)
我能够解决这个问题。我必须进入 IIS > FastCGI 设置 > Select 我的 PHP 应用 > 单击右侧栏上的 编辑 > 展开Advanced 菜单 > 将 Protocol 从 NamedPipe 更改为 Tcp。
我遇到这个问题的方式是我在另一台 Windows 服务器上进行了测试,我们有 运行ning PHP,它使用的是正确的 account/identity在 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
按预期工作。
我有一个站点在 IIS 的 Windows Server 2012 R2 上使用 PHP 脚本 运行ning。我正在尝试使用 fopen 读取我们网络中另一台服务器上的文件,但遇到了问题。我可以使用 fopen 命令打开本地服务器上的文件,使用 PHP CLI,我可以成功打开远程服务器上的文件。
但是,当我尝试使用我的浏览器通过网站处理它时,它失败并显示错误:
"failed to open stream: Permission denied"
在 IIS 中,我创建了一个新的应用程序池并将其身份设置为域管理员,它对两台服务器都具有管理员访问权限,但这似乎没有帮助。这与我 运行 CLI 工作时使用的帐户相同。
这是我正在使用的 PHP 脚本代码:
fopen("//remoteservername/c$/inetpub/wwwroot/test.html", "w") or die("Can't open file!");
我试过使用反斜杠(也有转义的)。我试过在路径前使用 FILE:// 。我试过将远程服务器的驱动器映射到 Web 服务器 运行ning PHP 并使用像 Y:\inetpub 这样的路径...我试过使用 "rb" 而不是 "w" 因为它们都是 Windows 服务器。
我觉得这与网站 运行 所在的 account/identity 有关,但我不确定为什么在我更改后它仍然无法正常工作。
更新:我提到过 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");
正如 php manual 所说,您应该使用 \\localservername\c$\inetpub\wwwroot\test.html
但是因为 \ 它是用于转义其他特殊字符的保留字符,所以您应该像这样将 \ 的数量加倍:
fopen("\\localservername\c$\inetpub\wwwroot\test.html", "w") or die("Can't open file!");
如果它不起作用您应该检查运行 php 脚本的网络服务器的用户是否具有访问所需的权限该资源。
管理共享(驱动器 + $)通常只允许管理员使用。
恕我直言,最好创建一个具有网络服务器用户权限的共享文件夹,而不是使用管理共享 (c$)
我能够解决这个问题。我必须进入 IIS > FastCGI 设置 > Select 我的 PHP 应用 > 单击右侧栏上的 编辑 > 展开Advanced 菜单 > 将 Protocol 从 NamedPipe 更改为 Tcp。
我遇到这个问题的方式是我在另一台 Windows 服务器上进行了测试,我们有 运行ning PHP,它使用的是正确的 account/identity在 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
按预期工作。