14

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

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

“... 没有权限 ...”

我已经排除了与文件夹权限有关的任何事情(我尝试了多个组:所有人、用户、IUSR、网络服务等,但没有运气)。

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

如果是这样,那么这可能是问题的根源,因为 Windows Server 2008 中的所有文件夹都被标记为“只读”并且复选框是灰色的 - 微软说这是“设计使然”,但我认为它真的很“糟糕”设计”。

请帮忙。

PS 可以在这里找到错误的代码行https://github.com/LimeSurvey/LimeSurvey/blob/070d255ba381d7abcd231d7c9e0c7d11f5578c97/admin/templates.php#L1182它是第 1182 行。

解决方案:

  • 毕竟是权限问题!
  • 我们正在向错误的文件夹应用权限(用手摸额头)
  • 有两个“模板”文件夹:/Templates 和 /Uploads/Templates
  • /Template 用于默认模板,而 /Uploads/Templates 用于用户创建的模板
  • 我们授予“用户”组 r/w/execute/modify 对 /Uploads/Templates 文件夹的权限
  • 而之前我们对 /Templates 应用权限
  • 为了调试这个我用来echo输出$target

得到教训:

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

赏金授予@BOMEz,因为mkdir()文档中的有用引用表明我应该仔细考虑权限。@BOMEz 还提供了量身定制的答案,并通过有帮助的评论与我互动。

4

4 回答 4

7
  • 作为测试(最好是在开发环境中),给予 IIS 用户对父文件夹的完全访问权限。如果这使它起作用,请慢慢开始取消特权以查看您需要哪些特权。

  • 尝试改变:

    if(mkdir($target,0777))

到:

if(mkdir($target))

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

此外,对于您的 $target 变量,您可以尝试强制它链接到完整的 Windows 路径吗?如C:\Program Files\ IIS\...

在尝试使用相对路径拒绝访问之前,我遇到过 Windows 的情况,但完整路径工作得很好。

编辑:查看mkdir()文档的评论,一位评论者提到您可能还需要向用户添加执行权限:

如果您收到 Permission Denied 错误,但确定您尝试创建目录的权限和所有权是正确的,请再次检查:

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

这对某些人来说可能很明显,但起初对我来说并不明显。希望这可以为您省去我遇到的麻烦。

于 2012-06-22T18:04:42.370 回答
4

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

话虽如此,其中一些权限问题可以解决。

您需要为该站点创建一个管理员帐户(并将其添加到管理员组)以使用或仅使用您的管理员凭据。

  1. 打开 IIS 管理器
  2. 扩展站点
  3. 突出显示有问题的网站
  4. 在屏幕右侧单击“基本设置”,应弹出一个对话框。
  5. 单击底部显示“连接为...”的按钮
  6. 选择“特定用户”,然后单击“设置...”按钮
  7. 键入您的帐户或您创建的帐户的用户名和密码。
  8. 点击“确定”按钮 3 次。

这有点像大锤修复,因为它将授予您脚本对文件系统的完全不受限制的访问权限。

如果您创建了一个新用户并且想要维护某种级别的脚本安全性,那么您可以尝试将该用户从管理员组中拉出,然后通过以下方式仅授予它对该站点的完全权限:

  1. 突出显示网站
  2. 右键单击,编辑权限
  3. 安全选项卡
  4. 点击“编辑”按钮
  5. 点击“添加”按钮
  6. 单击“高级”,然后单击“立即查找”
  7. 双击您创建的用户
  8. 点击“确定”
  9. 突出显示您的用户,勾选完全控制旁边的允许下的框
  10. 单击“确定”两次

如果询问,请选择您要应用于所有目录和文件。

~

如果您仍然有问题,那么很有可能您的 php 设置配置不正确或损坏。(可能打开了安全模式?)

于 2012-06-26T20:40:26.443 回答
1

以下是权限的解释。

    • 在文件上:这意味着读取文件的内容
    • 在目录上:意思是查看目录的内容,即能够使用lsdir
    • 在文件上:这意味着能够编辑文件的内容
    • 在目录上:这意味着能够创建/修改目录的内容,即在该目录中创建新文件或文件夹。
  • 执行

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

--

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

于 2012-06-21T14:27:34.060 回答
1

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

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

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

于 2012-06-21T14:35:20.400 回答