У меня возникла проблема с PHP-сайтом, работающим на IIS 7 в Windows Server 2008.
Существует одна строка кода, вызывающая mkdir, которая является ошибкой, и журнал ошибок читает:
"… доступ запрещен …"
Я исключил все, что связано с разрешениями на папку (я попробовал несколько групп: «Все», «Пользователи», «IUSR», «Сетевая служба» и т.д.).
Мне нужно знать, как работает mkdir, проверяет ли атрибут только для чтения родительскую папку?
Если это так, то это может быть причиной проблемы, так как все папки в Windows Server 2008 помечены как «Только для чтения», а флажок выделен серым цветом – Microsoft заявляет, что это «по дизайну», но я думаю, что это действительно «плохо» дизайн".
Пожалуйста помоги.
PS Строка кода, в которой ошибки можно найти здесь, https://github.com/LimeSurvey/LimeSurvey/blob/070d255ba381d7abcd231d7c9e0c7d11f5578c97/admin/templates.php#L1182 это строка 1182.
РЕШЕНИЕ:
echo
для вывода $target
value УРОКИ ВЫУЧЕНЫ:
Баунти, присвоенная @BOMEz из-за полезной цитаты из документации mkdir()
которая указала, что я должен дважды подумать о разрешениях. @BOMEz также предоставил индивидуальный ответ и взаимодействовал со мной через комментарии, которые помогли.
В качестве теста (желательно в среде разработки) предоставить пользователю IIS полный доступ к родительской папке. Если это заставляет его работать, медленно начинайте отбирать привилегии, чтобы узнать, какие из них вам нужны.
Попробуйте изменить:
if(mkdir($target,0777))
чтобы:
if(mkdir($target))
Windows игнорирует параметр режима. Может быть, какая-то странная ошибка, из-за которой она терпит неудачу.
Кроме того, для вашей переменной $ target можно попробовать заставить ее ссылаться на полный путь к Windows? Например, C:\Program Files\ IIS\...
Я столкнулся с ситуациями с окнами перед тем, как было отказано в доступе к использованию относительного пути, но полный путь работает отлично.
EDIT: В комментариях к документации для mkdir () один комментатор упоминает, что вам также может потребоваться добавить права доступа для пользователя:
Если вы получаете ошибку с разрешением отказа, но уверены, что права и права собственности, где вы пытаетесь создать каталог, верны, еще раз проверьте:
Место, где вы пытаетесь создать каталог, должно иметь разрешение Execute для владельца, пытающегося его создать, независимо от того, является ли папка «Readable» или «Writable».
Это может быть очевидно для некоторых, но не для меня вначале. Надеюсь, это спасет вас от неприятностей, которые я пережил.
Поскольку вы не упомянули о какой-либо панели управления, я предполагаю, что у вас есть доступ к серверу как на физическом, так и на удаленном рабочем столе. Я также собираюсь предположить, что вы проверили ваши настройки php.ini.
При этом для некоторых из этих проблем разрешения существует проблема.
Вам нужно будет создать учетную запись администратора (и добавить ее в группу администраторов) для использования этого сайта или просто использовать учетные данные администратора.
Это немного исправление кувалды, поскольку он предоставит полный неограниченный доступ к файловой системе из ваших скриптов.
Если вы создали нового пользователя и хотите поддерживать некоторый уровень безопасности сценария, вы можете попытаться вытащить пользователя из группы администраторов, а затем предоставить ему полные разрешения только на этом сайте:
В ответ на запрос выберите, что вы хотите применить ко всем каталогам и файлам.
~
Если у вас все еще есть проблемы, есть хорошая вероятность, что ваша настройка php настроена неправильно или повреждена. (Возможно, включен безопасный режим?)
Ниже приводится объяснение разрешений.
Читать
ls
или dir
Написать
казнить
–
Итак, теперь, когда вы очищаете ответ на свою проблему (как вы правильно догадались), для создания нового каталога или записи новых файлов в каталог вам нужно разрешение на запись в этом каталоге. Поэтому для того, чтобы сделать папки в C:/your_folder/
вам нужно, write
и execute
разрешения в этой папке. (Да, вам тоже нужно выполнить выполнение, поскольку, по-видимому, для mkdir
вам нужно сначала войти в папку.)
Одной из проблем, с которыми мы сталкиваемся довольно часто, является то, что файлы были перемещены из любого местоположения в местоположение сайтов, сохраняя исходные разрешения вместо наследования разрешения, необходимого пользователю пула приложений пула, используемого сайтом.
Итак, одна хорошая вещь, которую нужно попробовать, – это щелкнуть правой кнопкой мыши корневую папку вашего документа, перейти к свойствам и вкладке безопасности. Нажмите кнопку «Дополнительно», установите флажок «Заменить записи разрешений на всех дочерних объектах с показаниями, показанными здесь, которые относятся к дочерним объектам». Таким образом, вы можете, по крайней мере, убедиться, что все ваши разрешения установлены во всех подпапках и файлах.
У нас nerver возникли проблемы с атрибутом read only, хотя это проверено для всех наших папок. (выделено серым цветом / отмечено). Поэтому я сомневаюсь, что это ваши проблемы.