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

时间:2012-06-18 19:05:08

标签: php iis iis-7 permissions windows-server-2008

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

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

“......许可被拒绝......”

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

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

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

请帮忙。

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

解决方案:

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

经验教训:

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

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

4 个答案:

答案 0 :(得分:5)

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

  • 尝试更改:

    if(mkdir($target,0777))

为:

if(mkdir($target))

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

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

在尝试使用相对路径拒绝访问之前,我遇到过使用Windows的情况,但完整路径运行正常。

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

  

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

     

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

     

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

答案 1 :(得分:3)

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

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

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

  1. 打开IIS管理器
  2. 展开网站
  3. 突出显示有问题的网站
  4. 在屏幕右侧单击“基本设置”,将弹出一个对话框。
  5. 点击底部显示“Connect as ...”
  6. 的按钮
  7. 选择“特定用户”,然后点击“设置...”按钮
  8. 输入您的帐户或您创建的帐户的用户名和密码。
  9. 按“确定”按钮3次。
  10. 这是一个大锤修复,因为它将授予从脚本完全不受限制的文件系统访问权限。

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

    1. 突出显示网站
    2. 右键单击,编辑权限
    3. 安全标签
    4. 点击“修改”按钮
    5. 点击“添加”按钮
    6. 点击“高级”,然后点“立即查找”
    7. 双击您创建的用户
    8. 点击“确定”
    9. 突出显示您的用户,勾选“完全控制旁边的允许”下面的框
    10. 点击“确定”两次
    11. 如果询问,请选择要应用于所有目录和文件。

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

答案 2 :(得分:1)

以下是权限说明。

  • <强>读取

    • 在文件上:这意味着阅读文件的内容
    • 在目录上:它表示查看目录的内容,即能够使用lsdir
  • <强>写

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

    • 在文件上:这意味着从文件中执行代码(对于脚本/可执行文件)
    • 在目录上:表示进入目录。未经此许可,您无法cd进入该目录。

-

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

答案 3 :(得分:1)

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

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

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