我目前正在开发一个 PHP 前端,它将一系列在不同服务器上运行的应用程序连接在一起;其中许多应用程序都会生成我需要访问的文件,但这些文件(由于各种原因)驻留在它们的父服务器上。
如果我从命令行发出一些脚本,例如:
<?php
var_dump(glob("\\\\machine-name\\some\\share\\*"));
我将获得该目录的完整内容,这证明 PHP 以编程方式读取 UNC 共享内容没有任何问题。但是,如果我尝试从 Web 服务器执行相同的脚本,则会得到一个空数组 — 更具体地说,如果我使用更明确的函数来“打开”目录(就像打开文件一样),则会收到访问错误。
我认为这是一个权限问题,但我不是服务器/网络管理员类型,所以我不确定我需要做什么来纠正这个问题并让我的脚本运行,而且我检查过的链接并没有太多的帮助,也许是因为我的背景,或者就 IIS 而言缺乏背景,再加上我们实际上并没有为此使用 .NET。
相关统计数据:Windows Server 2008 Standard SP2 IIS 7.0 PHP 5.2.9
我将连接两种类型的服务器:几台其他几乎相同的 Server 2008 机器和一台运行嵌入式 XP 的机器。
这些链接并没有特别的帮助,但也许我只是误读了:
答案1
正如您所猜测的,这是一个权限问题... IIS 工作进程正在运行的用户是计算机上的本地帐户(很可能是 IUSER_ <MACHINENAME>
),并且该用户未经过身份验证(该帐户甚至不存在!)在您尝试通过 UNC 浏览的其他计算机上
仅作为测试,您可以进入 IIS 管理器并更改该网站正在运行的 IIS 服务... 不过,我使用的是 Server 2003/IIS 6 中的术语,因为我手边没有 Server 2008 框。如果您在 IIS 7 管理器中四处查看,您应该能够找到可以设置工作进程以何种用户身份运行的位置。
答案2
您的 PHP 应用程序使用服务帐户运行,这是使用其凭据来访问网络资源的用户帐户。 IIS 默认使用 Web 服务器的本地帐户来执行此操作,并且该帐户无权访问网络资源(因为它是本地帐户)。
您应该配置您的网站的 IIS 应用程序池以使用域用户帐户运行,然后授予该用户帐户在网络共享上的适当权限。
如果您没有 Active Directory 域,或者这两台服务器不是其成员,事情就会变得有点棘手,但无论如何都可以通过在两台服务器上创建具有相同用户名和密码的两个用户帐户来完成。
答案3
如果您使用的是“Windows Server 2008 Standard SP2 IIS 7.0”,那您为什么要阅读上个世纪的 Windows-es/IIS-es 文章呢?
您不可能拥有那些文章“应用于:”部分描述的任何内容,例如 IIS3.0-5.0(主要是 IIS 4.0)、经典 ASP(1999 年弃用)、弃用的 FrontPage Extensions、ASP.NET.0-1.1(C#.NET/VB.NET 2002)和工作组中的工作站上下文!
您有 AD/DC 吗?
请阅读我的回答模拟不起作用 - 网络共享