由于只读属性,在Windows Server 2008 IIS 7上运行PHP mkdir权限被拒绝?

由于只读属性,在Windows Server 2008 IIS 7上运行PHP mkdir权限被拒绝?,php,iis,iis-7,permissions,windows-server-2008,Php,Iis,Iis 7,Permissions,Windows Server 2008,我在Windows Server 2008的IIS 7上运行PHP网站时遇到问题 有一行代码调用mkdir,该代码出错,错误日志显示: “……许可被拒绝……” 我排除了与文件夹权限有关的任何内容(我尝试了多个组:所有人、用户、IUSR、网络服务等,但都没有成功)。 我需要知道mkdir是如何工作的,它是否检查父文件夹的只读属性? 如果是这样的话,那么这可能是问题的根源,因为Windows Server 2008中的所有文件夹都标记为“只读”,并且复选框变灰-Microsoft说这是“按设计”,但

我在Windows Server 2008的IIS 7上运行PHP网站时遇到问题

有一行代码调用mkdir,该代码出错,错误日志显示:

“……许可被拒绝……”

我排除了与文件夹权限有关的任何内容(我尝试了多个组:所有人、用户、IUSR、网络服务等,但都没有成功)。

我需要知道mkdir是如何工作的,它是否检查父文件夹的只读属性?

如果是这样的话,那么这可能是问题的根源,因为Windows Server 2008中的所有文件夹都标记为“只读”,并且复选框变灰-Microsoft说这是“按设计”,但我认为这确实是“糟糕的设计”

请帮忙

另外,此处可以找到错误的代码行是第1182行

解决方案:

  • 这毕竟是一个权限问题
  • 我们将权限应用到错误的文件夹(从头到脚)
  • 有两个“模板”文件夹:/Templates和/Uploads/Templates
  • /模板用于默认模板,而/Uploads/templates用于用户创建的模板
  • 我们向“用户”组r/w/execute/modify授予/Uploads/Templates文件夹的权限
  • 而之前,我们将权限应用于/模板
  • 为了调试它,我使用了
    echo
    来输出
    $target
经验教训:

  • 始终阅读错误消息-它说“权限被拒绝”,我不相信它
  • 不要假设显而易见的是真的-/Templates不是正确的文件夹
  • 如果代码出错,则调试代码,不要试图猜测问题
  • 使用简单的技术调试代码,例如输出变量值(例如echo)
  • 听大多数人的话——这里的大多数人说这是一个权限问题是正确的
  • 大多数错误都有一个简单的修复方法——不要去寻找复杂的东西

由于
mkdir()
文档中的有用引用,我将赏金授予@BOMEz,这表明我应该加倍考虑权限@BOMEz还提供了一个定制的答案,并通过有帮助的评论与我互动。

以下是权限的解释

  • 阅读

    • 在文件上:这意味着读取文件的内容
    • 在目录上:它意味着查看目录的内容,即能够使用
      ls
      dir
  • 写入

    • 在文件上:这意味着能够编辑文件的内容
    • 在目录上:这意味着能够创建/修改目录的内容,即在该目录中创建新文件或文件夹
  • 执行

    • 在文件上:这意味着从文件中执行代码(对于脚本/可执行文件)
    • 在目录上:这意味着,输入目录。没有此权限,您不能
      cd
      进入该目录
--


因此,现在这清楚地说明了问题的答案(正如您正确猜测的那样),对于创建新目录或将新文件写入目录,您需要对该目录的写入权限。因此,要将文件夹制作成
C:/your_folder/
您需要,
write
execute
对该文件夹的权限。(是的,您也需要执行,显然对于
mkdir
您需要首先进入文件夹。)

我们经常遇到的问题之一是文件已从任何位置移动到网站位置,维护原始权限,而不是继承网站正在使用的池的应用程序池用户所需的权限

因此,一个好方法是右键单击文档根文件夹,转到属性,然后单击安全选项卡。按下高级按钮,选中复选框a“用此处显示的适用于子对象的条目替换所有子对象上的权限条目”。这样,您至少可以确保对所有子文件夹和文件设置了所有权限

我们从未遇到过只读属性的任何问题,即使我们所有的文件夹都检查了这个属性。(灰显/选中)。所以我怀疑这是你的问题。

  • 作为测试(最好在开发环境中),允许IIS用户完全访问父文件夹。如果这使它起作用,慢慢地开始取消特权,看看你需要哪些特权

  • 尝试更改:

    if(mkdir($target,0777))

致:

if(mkdir($target))

Windows忽略模式选项。可能是某种奇怪的错误导致它失败

另外,对于$target变量,您是否可以尝试强制它链接到完整的Windows路径?例如
C:\ProgramFiles\IIS\…

我以前在windows中遇到过尝试使用相对路径时被拒绝访问的情况,但完整路径工作正常

编辑: 查看文档中关于一位评论者的评论,您可能还需要向用户添加执行权限:

如果您遇到权限被拒绝错误,但确定 您试图创建目录的权限和所有权 如果正确,请再次检查:

您试图在其中创建目录的位置必须具有 尝试创建它的所有者的执行权限,无论 文件夹是否可读或可写

这对一些人来说可能是显而易见的,但对我来说一开始并不是这样。有希望地 这会帮你省去我的麻烦


由于您没有提到任何类型的控制面板,我假设您可以访问服务器的物理或远程桌面。我还假设您检查了php.ini设置