我在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还提供了量身定制的答案,并通过评论帮助我与我互动。
至:
if(mkdir($target))
Windows忽略模式选项。可能是一些奇怪的错误导致它失败。
另外,对于$ target变量,您可以尝试强制它链接到完整的Windows路径吗?如 C:\Program Files\ IIS\...
我已经遇到过Windows的情况,之前拒绝访问尝试使用相对路径,但完整路径工作得很好。
编辑:
查看有关文档的评论 MKDIR() 一位评论者提到您可能还需要向用户添加执行权限:
如果你收到一个Permission Denied错误,但是肯定是
您尝试创建目录的权限和所有权
是正确的,再次检查:
您尝试创建目录的位置必须具有
无论如何,所有者尝试创建它的执行权限
如果文件夹是可读的或可写的。
这对某些人来说可能是显而易见的,但起初并不适合我。希望
这样可以省去我遇到的麻烦。
由于您没有提到任何类型的控制面板,我将假设您可以访问服务器物理或远程桌面。我也假设你检查了你的php.ini设置。
话虽如此,有一些解决这些许可问题的方法。
您需要创建一个管理员帐户(并将其添加到管理员组)才能使用此站点或仅使用您的管理员凭据。
- 打开IIS管理器
- 展开网站
- 突出显示相关网站
- 在屏幕右侧单击“基本设置”,将弹出一个对话框。
- 点击底部显示“Connect as ...”的按钮
- 选择“特定用户”,然后单击“设置...”按钮
- 输入您的帐户或您创建的帐户的用户名和密码。
- 按“确定”按钮3次。
这是一个大锤修复,因为它将授予从脚本完全不受限制的文件系统访问权限。
如果您创建了一个新用户,并且希望保持某种程度的脚本安全性,那么您可以尝试将用户从管理员组中拉出来,然后仅使用以下内容为该站点授予其完全权限:
- 突出显示网站
- 右键单击,编辑权限
- 安全选项卡
- 点击“修改”按钮
- 点击“添加”按钮
- 点击“高级”,然后“立即查找”
- 双击您创建的用户
- 点击“确定”
- 突出显示您的用户,勾选在完全控制旁边的允许下方的框
- 单击“确定”两次
如果询问,请选择要应用于所有目录和文件。
〜
如果你仍然有问题,那么很有可能你的PHP设置配置不正确或损坏。 (安全模式可能打开?)
以下是权限的说明。
读
- 在文件上:这意味着读取文件的内容
- 在目录上:它表示查看目录的内容,即能够使用
ls
要么 dir
写
- 在文件上:这意味着能够编辑文件的内容
- 在目录上:它意味着能够创建/修改目录的内容,即在该目录中创建新文件或文件夹。
执行
- 在文件上:这意味着从文件中执行代码(对于脚本/可执行文件)
- 在目录上:这意味着,进入目录。你不能
cd
没有此权限进入该目录。
-
所以,现在这清楚地说明了你的问题的答案(正如你猜对了),为了创建新目录或将新文件写入目录,你需要对该目录具有写权限。所以对于制作文件夹说 C:/your_folder/
你需要, write
和 execute
该文件夹的权限。 (是的,你也需要执行,显然是为了 mkdir
你需要先进入文件夹。)
我们经常遇到的一个问题是文件已从任何位置移动到网站位置,维护原始权限,而不是继承网站使用的池的应用程序池用户所需的权限。
因此,尝试的一件好事是右键单击文档根文件夹,转到属性,然后转到安全选项卡。按高级按钮,选中复选框“将所有子对象上的权限条目替换为此处显示的适用于子对象的条目”。这样您至少可以确保在所有子文件夹和文件上设置所有权限。
我们对于只读属性有任何问题,即使检查了所有文件夹。 (变灰/检查)。所以我怀疑这是你的问题。