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


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

有一行代码调用mkdir,这是错误的,错误日志读取:

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

我已经排除了与文件夹权限有关的任何事情(我尝试了多个组:Everyone,Users,IUSR,Network Service等没有运气)。

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

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

请帮忙。

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

解:

  • 毕竟这是一个权限问题!
  • 我们将权限应用于错误的文件夹(从前额到手)
  • 有两个“模板”文件夹:/模板和/上传/模板
  • / Template用于默认模板,而/ Uploads / Templates用于用户创建的模板
  • 我们将“用户”组的r / w /执行/修改权限授予/ Uploads / Templates文件夹
  • 而以前我们将权限应用于/ Templates
  • 要调试这个,我用过 echo 输出 $target 值

得到教训:

  • 总是阅读错误消息 - 它说“许可被拒绝”,我不相信
  • 不要假设显而易见 - /模板不是正确的文件夹
  • 如果代码出错,则调试代码,不要试图猜测问题
  • 使用简单的技术调试代码,例如输出变量值 - 例如回声
  • 聆听大多数人 - 这里的大多数人都说得对,这是一个允许的问题!
  • 大多数错误都有一个简单的修复 - 不要去寻找复杂的东西

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


7148
2018-06-18 19:05


起源

你可以在mkdir周围发布代码片段吗?可能只是需要将完整路径放在要创建的目录上,而不仅仅是它的名称。 - BOMEz
以下是错误的代码行: github.com/LimeSurvey/LimeSurvey/blob/... 这是第1182行。 - Chris Cannon


答案:


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

  • 尝试改变:

    if(mkdir($target,0777))

至:

if(mkdir($target))

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

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

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

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

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

您尝试创建目录的位置必须具有   无论如何,所有者尝试创建它的执行权限   如果文件夹是可读的或可写的。

这对某些人来说可能是显而易见的,但起初并不适合我。希望   这样可以省去我遇到的麻烦。


5
2018-06-22 18:04



谢谢..帮助了我。 - ako


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

话虽如此,有一些解决这些许可问题的方法。

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

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

这是一个大锤修复,因为它将授予从脚本完全不受限制的文件系统访问权限。

如果您创建了一个新用户,并且希望保持某种程度的脚本安全性,那么您可以尝试将用户从管理员组中拉出来,然后仅使用以下内容为该站点授予其完全权限:

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

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

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


3
2018-06-26 20:40





以下是权限的说明。

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

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

-

所以,现在这清楚地说明了你的问题的答案(正如你猜对了),为了创建新目录或将新文件写入目录,你需要对该目录具有写权限。所以对于制作文件夹说 C:/your_folder/ 你需要, write 和 execute 该文件夹的权限。 (是的,你也需要执行,显然是为了 mkdir 你需要先进入文件夹。)


1
2018-06-21 14:27





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

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

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


1
2018-06-21 14:35