Разрешение PHP mkdir Отказано в работе в Windows Server 2008 IIS 7 из-за атрибута только для чтения?

У меня проблема с PHP-сайтом, работающим на IIS 7 на Windows Server 2008.

Существует одна строка кода, вызывающая mkdir, которая является ошибкой, и журнал ошибок читает:

"... разрешено..."

Я исключил что-либо, связанное с разрешениями на папку (я пробовал несколько групп: все, пользователи, IUSR, сетевая служба и т.д., не повезло).

Мне нужно знать, как работает mkdir, проверяет ли атрибут только для чтения родительскую папку?

Если это так, то это может быть причиной проблемы, так как все папки в Windows Server 2008 помечены как "Только для чтения", а флажок выделен серым цветом - Microsoft говорит, что это "по дизайну", но я думаю, что это действительно "плохой дизайн".

Пожалуйста, помогите.

P.S. Строка кода, где ошибки можно найти здесь https://github.com/LimeSurvey/LimeSurvey/blob/070d255ba381d7abcd231d7c9e0c7d11f5578c97/admin/templates.php#L1182, это строка 1182.

РЕШЕНИЕ:

  • Это была проблема с разрешениями!
  • Мы применяли разрешения к неправильной папке (прикладывали руку к лбу)
  • Существуют две папки "Шаблоны":/Шаблоны и /Uploads/Templates
  • /Шаблон предназначен для шаблонов по умолчанию, тогда как /Uploads/Templates для созданных пользователями
  • Мы предоставили группе "Пользователи" полномочия r/w/execute/modify для папки /Uploads/Templates
  • Если раньше мы применяли разрешения для /Templates
  • Чтобы отладить это, я использовал echo для вывода значения $target

ИЗВЛЕЧЕННЫЕ УРОКИ:

  • Всегда читайте сообщение об ошибке - он сказал, что "разрешение отклонено", и я не верил ему.
  • Не считайте очевидным, чтобы быть правдой -/Шаблоны не были правильной папкой
  • Если код является ошибкой, отлаживайте код и не пытайтесь угадать проблему.
  • Отладить код, используя простые методы, такие как вывод значений переменных - например. эхо
  • Слушайте большинство - большинство людей здесь были правы, говоря, что ЭТО ПРОБЛЕМА ВЫПУСКА!
  • У большинства ошибок есть простое исправление - не ищите чего-то сложного.

Bounty, присвоенный @BOMEz из-за полезной цитаты из mkdir() документации, которая указала, что я должен дважды подумать о разрешениях. @BOMEz также предоставил индивидуальный ответ и взаимодействовал со мной через комментарии, которые помогли.

Ответ 1

  • Как тест (желательно в среде разработки), пользователь IIS может получить полный доступ к родительской папке. Если это заставляет его работать, медленно начинайте отбирать привилегии, чтобы узнать, какие из них вам нужны.

  • Попробуйте изменить:

    if(mkdir($target,0777))

в

if(mkdir($target))

Windows игнорирует параметр режима. Может быть, какая-то странная ошибка, из-за которой она терпит неудачу.

Кроме того, для переменной $target вы можете заставить ее ссылаться на полный путь к Windows? Например, C:\Program Files\ IIS\...

Я столкнулся с ситуациями с окнами, перед которыми было отказано в попытке использовать относительный путь, но полный путь работает нормально.

EDIT: В комментариях к документации для mkdir() один комментатор упоминает, что вам также может потребоваться добавить права доступа пользователю:

Если вы получаете ошибку отказа от разрешения, но уверены, что разрешений и прав собственности, где вы пытаетесь создать каталог верны, еще раз проверьте:

Место, где вы пытаетесь создать каталог, должно иметь разрешение Execute для владельца, пытающегося его создать, независимо от того, если папка читается или Writable.

Это может быть очевидно для некоторых, но не для меня вначале. С надеждой это спасет вас от неприятностей, которые я пережил.

Ответ 2

Поскольку вы не упомянули о какой-либо панели управления, я предполагаю, что у вас есть доступ к серверу как на физическом, так и на удаленном рабочем столе. Я также предполагаю, что вы проверили ваши настройки php.ini.

Говоря об этом, для некоторых из этих проблем разрешений есть работа.

Вам понадобится создать учетную запись администратора (и добавить ее в группу администраторов) для использования этого сайта или просто использовать учетные данные администратора.

  • Откройте диспетчер IIS
  • Развернуть сайты
  • Выделите соответствующий сайт
  • В правой части экрана нажмите "Основные настройки", появится диалоговое окно.
  • Нажмите кнопку внизу, в которой говорится: "Подключить как..."
  • Выберите "Конкретный пользователь", а затем нажмите кнопку "Установить..."
  • Введите имя пользователя и пароль вашей учетной записи или созданной учетной записи.
  • Нажмите кнопку "Ok" 3 раза.

Это немного исправление кувалды, поскольку он предоставит полный неограниченный доступ к файловой системе из ваших скриптов.

Если вы создали нового пользователя и хотите сохранить уровень безопасности script, вы можете попытаться вытащить пользователя из группы администраторов, а затем предоставить ему полные разрешения только на этом сайте со следующими параметрами:

  • Выделите сайт
  • Щелкните правой кнопкой мыши, выберите Разрешения для редактирования
  • Вкладка "Безопасность"
  • Нажмите кнопку "Изменить"
  • Нажмите кнопку "Добавить"
  • Нажмите "Дополнительно", затем "Найти сейчас"
  • Дважды щелкните по созданному вами пользователю.
  • Нажмите "Ok"
  • Выделите своего пользователя, поставьте галочку в поле под разрешением, которое находится рядом с полным контролем.
  • дважды нажмите "Ok"

В ответ на запрос выберите, что вы хотите применить ко всем каталогам и файлам.

~

Если у вас все еще есть проблемы, есть хорошая вероятность, что ваша настройка php настроена неправильно или повреждена. (Возможно, включен безопасный режим?)

Ответ 3

Ниже приводится объяснение прав доступа.

  • Read

    • В файле: это означает чтение содержимого файлов
    • В каталоге: это означает просмотр содержимого каталога, а именно, возможность использования ls или dir
  • Написать

    • В файле: это означает возможность редактирования содержимого файлов.
    • В каталоге: это означает возможность создания/изменения содержимого каталога, а именно создания новых файлов или папок в этом каталоге.
  • Выполнить

    • В файле: это означает выполнение кода из файла (для скриптов/исполняемых файлов)
    • В каталоге: это означает, что он входит в каталог. Вы не можете cd в этот каталог без этого разрешения.

-

Итак, теперь, когда выясняется ответ на вашу проблему (как вы правильно догадались), для создания нового каталога или записи новых файлов в каталог вам нужно разрешение на запись в этом каталоге. Поэтому для создания папок в say C:/your_folder/ вам нужны разрешения write и execute в этой папке. (Да, вам тоже нужно выполнить выполнение, так как, по-видимому, для mkdir вам нужно сначала войти в папку.)

Ответ 4

Одной из проблем, с которыми мы сталкиваемся довольно часто, является то, что файлы были перемещены из любого местоположения в местоположение сайтов, сохраняя исходные разрешения вместо наследования разрешения, необходимого пользователю пула приложений пула, используемого сайт.

Итак, одна хорошая вещь - попробовать щелкнуть правой кнопкой мыши корневую папку вашего документа, перейти к свойствам и вкладке безопасности. Нажмите кнопку "Дополнительно", установите флажок "Заменить записи разрешений на всех дочерних объектах с показаниями, показанными здесь, которые относятся к дочерним объектам". Таким образом, вы можете, по крайней мере, убедиться, что все ваши разрешения установлены во всех подпапках и файлах.

У nerver возникли проблемы с атрибутом read only, даже если это проверено для всех наших папок. (выделено серым цветом/отмечено). Поэтому я сомневаюсь, что это ваши проблемы.