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