Ошибка cffile ColdFusion 9 Доступ запрещен

Я получаю следующую ошибку:

The cause of this exception was: 
    java.io.FileNotFoundException:
    //server/c$/folder1/folder2/folder3/folder4/folder5/login.cfm
    (Access is denied).

При этом:

<cffile action="copy" 
    destination="#copyto#\#apfold#\#applic#\#files#"
    source="#path#\#apfold#\#applic#\#files#">

Если я попытаюсь написать C:\folder1\folder2\folder3\folder4\folder5\login.cfm, все будет нормально. Проблема с этим заключается в том, что это скрипт, позволяющий разработчикам вручную синхронизировать файлы с папкой своего приложения. У нас есть несколько серверов для каждого экземпляра, который случайным образом выбирается BigIP. Таким образом, простая запись на диск C:\ скопирует файл только на сервер, к которому в данный момент обращается разработчик. Поэтому, если разработчик закроет браузер и снова зайдет, чтобы убедиться, что его изменения сработали, если они будут отправлены на другой сервер, они не увидят своих изменений.

Поскольку он работает с записью в C:\, я знаю, что разрешения правильные. Я также скопировал путь из сообщения об ошибке и поместил его в адресную строку на сервере, и он отлично дошел до папки/файла. Что еще может помешать ему получить доступ к этому серверу?


person Lauren Robinson    schedule 08.04.2013    source источник
comment
Поскольку он работает с записью на C:, я знаю, что разрешения правильные — запись на C: является локальной для этого сервера, поэтому у него есть права. Запись на \\server не является локальной, поэтому необходимо использовать пользователя с правами на этот сервер. Это работало для вас в браузере, потому что браузер использовал ваши права, а не сервер ColdFusion.   -  person Miguel-F    schedule 09.04.2013


Ответы (3)


Кажется, вы хотите получить доступ к файлу через нотацию UNC в сетевой папке (даже если он случайно ссылается на каталог на локальном диске c:\). Чтобы сделать это, вы должны изменить пользователя, от которого работает служба сервера приложений ColdFusion 9. По умолчанию эта служба работает с пользователем «Локальная системная учетная запись», которую вам нужно изменить на фактического пользователя. Посмотрите следующую ссылку, чтобы узнать, как это сделать: http://mlowell.hubpages.com/hub/Coldfusion-Programming-Accessing-a-shared-network-drive

Обратите внимание, что вам, возможно, придется добавить пользователя с тем же именем, которое используется для службы CF 9, на все файловые серверы.

person Marcellus    schedule 08.04.2013
comment
Сервер приложений Coldfusion 9 входит в систему как ad\eis-cfappsvc на всех наших серверах. У этой учетной записи есть все права доступа ко всем папкам. - person Lauren Robinson; 09.04.2013
comment
Хорошо, звучит разумно. Вы правильно поняли синтаксис ‹cffile action=copy? Источник должен быть полным путем к файлу, полный путь назначения к каталогу? Если это не решит проблему, я бы попробовал что-то вроде ‹cfdirectory action=list ... › в удаленном каталоге, а затем cfdump результат, чтобы увидеть, есть ли у вас доступ для чтения к месту назначения. - person Marcellus; 09.04.2013
comment
Дух. Да, там была проблема. Имя файла было включено в место назначения. Спасибо. Я исправил это и получил еще одну ошибку: значение атрибута назначения, которое в настоящее время //сервер/папка1/папка2/папка3/папка4/папка5/, недопустимо. Я погуглил и нашел: Cffile может только манипулировать файлами, доступными в локальной файловой системе. Таким образом, вы не можете использовать URL. Думаю, мне придется прибегнуть к cfftp. Спасибо за помощь!! - person Lauren Robinson; 09.04.2013

Если вы не хотите включать ftp на своих серверах, другим вариантом будет использование RoboCopy для синхронизации серверов. Мне очень повезло с этим инструментом. Вам потребуется доступ к тегу cfexecute ColdFusion, и вам нужно будет создать общие ресурсы на своих серверах.

RoboCopy — это исполняемый файл, поставляемый с Windows. Вы можете прочитать некоторую документацию здесь и здесь. Он имеет несколько очень мощных функций и может быть настроен на «зеркальное отражение» содержимого каталогов с одного сервера на другой. В этом режиме папки будут оставаться идентичными (добавляются новые файлы, удаляются удаленные файлы, копируются обновленные файлы и т. д.). Вот как я его использовал.

По сути, вы создадите общий ресурс на своих целевых серверах и предоставите доступ определенному пользователю (может быть локальным или доменным). На исходном сервере вы запустите некоторый код ColdFusion, который:

  1. Логически сопоставляет диск с целевым сервером
  2. Запускает утилиту RoboCopy для копирования файлов на целевой сервер.
  3. Затем отключает сопоставленный диск

Службе ColdFusion на исходном сервере потребуется доступ к C:\WINDOWS\system32\net.exe и C:\WINDOWS\system32\robocopy.exe. Если вы используете безопасность изолированной программной среды ColdFusion, вам потребуется добавить записи для этих исполняемых файлов (только на исходном сервере). Вот несколько основных примеров кода.

Сначала сопоставьте целевой сервер:

<cfexecute name="C:\WINDOWS\system32\net.exe"
    arguments="use {share_name} {password} /user:{username}"
    variable="shareLog"
    timeout="30">
</cfexecute>

Здесь {share_name} будет что-то вроде \\server\c$. {username} и {password} должны быть очевидны. Вы можете указать имя пользователя как \\server\username. ПРИМЕЧАНИЕ Я бы предложил использовать созданный вами общий ресурс, а не административный общий ресурс c$, но это то, что было в вашем примере.

Затем скопируйте файлы с исходного сервера на целевой сервер:

<cfexecute name="C:\WINDOWS\system32\robocopy.exe"
    arguments="{source_folder} {destination_folder} [files_to_copy] [options]"
    variable="robocopyLog"
    timeout="60">
</cfexecute>

{source_folder} здесь будет что-то вроде C:\folder1\folder2\folder3\folder4\folder5\, а {destination_folder} будет \\server\c$\folder1\folder2\folder3\folder4\folder5\. Вы должны начать этот аргумент с {share_name} из шага выше, за которым следует желаемый путь к каталогу. [files_to_copy] — это список файлов или подстановочный знак (*.*), а [options] — это опции RoboCopy. См. ссылки, которые я включил для полного списка опций. Это обширно. Чтобы отразить структуру папок, используйте параметры /E и /PURGE. Я также обычно включаю параметры /NDL и /NP, чтобы ограничить генерируемый вывод. И /XA:SH для исключения системных и скрытых файлов. И /XO, чтобы не копировать старые файлы. Вы можете исключить другие файлы/каталоги специально или с помощью подстановочных знаков.

Затем отключите сопоставленный диск:

<cfexecute name="C:\WINDOWS\system32\net.exe"
    arguments="use {share_name} /d"
    variable="shareLog"
    timeout="30">
</cfexecute>

Работает как шарм. Если вы пойдете по этому пути и раньше не использовали RoboCopy, я настоятельно рекомендую сначала поиграть с параметрами/функциональными возможностями, используя командную строку. Затем, как только вы заставите его работать по своему вкусу, просто вставьте эти параметры в приведенный выше код.

person Miguel-F    schedule 09.04.2013
comment
Я обязательно посмотрю на это. Огромное спасибо!! - person Lauren Robinson; 10.04.2013

Я столкнулся с аналогичной проблемой с этим, и это заставило меня почесать голову. Мы используем Active Directory вместе с путем UNC к SERVERSHARE/webroot. Приложение работало нормально, за исключением использования CFFILE для создания каталога. Мы запускали наш CFService в качестве учетной записи домена, и разрешения были предоставлены для папки webroot (находящейся на сервере UNC). Эта же учетная запись домена также использовалась для подключения к пути UNC в IIS. Я даже зашел так далеко, что предоставил ПОЛНЫЙ контроль над папкой webroot, но мне все равно не повезло.

В конечном итоге я обнаружил, что причиной проблемы было то, что для папки Inetpub (родительская папка для нашего веб-сайта) был включен общий доступ, но этот общий доступ не включал общий доступ «Чтение / запись» для нашей учетной записи домена CFService.

Таким образом, несмотря на то, что у нас был общий доступ к Inetpub и были включены более мощные пользовательские разрешения для папки Inetpub/webroot, разрешения общего доступа (или их отсутствие) имели приоритет над более детализированными разрешениями безопасности пользователя webroot.

Надеюсь, это поможет кому-то другому.

person Jared Conti    schedule 11.07.2014