我有一个使用在 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!");
Run Code Online (Sandbox Code Playgroud)
我尝试过使用反斜杠(也包括转义反斜杠)。我尝试在路径前面使用 FILE:// 。我尝试将远程服务器的驱动器映射到运行 PHP 的 Web 服务器,并使用 Y:\inetpub 之类的路径...我尝试使用“rb”而不是“w”,因为它们都是 Windows 服务器。
我觉得这与网站运行的帐户/身份有关,但我不确定为什么在更改后它仍然无法工作。
更新:我提到 fopen 可以读取本地服务器上的文件,但似乎只有当我使用如下所示的相对路径时才是正确的......
fopen("test.html", "w") or die("Can't open file!");
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用如下所示的绝对路径在本地服务器上打开同一文件,则会失败。所以我不再相信这是一个身份问题......
fopen("//localservername/c$/inetpub/wwwroot/test.html", "w") or die("Can't open file!");
Run Code Online (Sandbox Code Playgroud)
更新:所以我在 CLI 和浏览器上运行了 shell_exec("whoami") 。当我在 CLI 中执行此操作时,它会显示我正在运行 shell 的域帐户。但是,当我通过浏览器运行脚本时,它显示“nt Authority\iusr”。有什么想法如何让它在不同的用户下运行吗?更改 IIS 中的应用程序池标识似乎与我在测试中看到的结果没有什么不同。
echo shell_exec("whoami");
Run Code Online (Sandbox Code Playgroud)
我能够解决这个问题。我必须进入 IIS > FastCGI 设置> 选择我的 PHP 应用程序 > 单击右侧边栏上的编辑> 展开高级菜单 > 将协议从NamedPipe更改为Tcp。
我遇到这个问题的方法是我在另一个运行 PHP 的 Windows 服务器上进行了测试,它使用了在 AppPool 中设置的正确帐户/身份。因此,我在服务器上设置了一个新站点来进行测试,但我什至无法运行echo shell_exec("whoami");当我开始排除故障时,我遇到了这个站点:http ://tech.trailmax.info/2012/12/php-warning-shell_exec -无法在iis-7上执行/
我按照这些步骤操作,不仅解决了无法运行的问题shell_exec,而且还开始使用我在 IIS AppPool 中设置的域帐户运行我的 PHP 脚本。现在fopen按预期工作。