2

我收到以下错误:

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:\,因此我知道权限是正确的。我还从错误消息中复制了路径并将其放在服务器的地址栏中,它可以很好地到达文件夹/文件。还有什么可以阻止它访问该服务器?

4

3 回答 3

3

似乎您想通过 UNC 表示法访问网络文件夹上的文件(即使它偶然引用了本地 c:\ 驱动器上的目录)。为此,您必须更改运行 ColdFusion 9 应用程序服务器服务的用户。默认情况下,此服务使用用户“本地系统帐户”运行,您需要将其更改为实际用户。查看以下链接以了解如何执行此操作:http: //mlowell.hubpages.com/hub/Coldfusion-Programming-Accessing-a-shared-network-drive

请注意,您可能必须将与用于 CF 9 服务的用户同名的用户添加到所有文件服务器。

于 2013-04-08T20:23:11.173 回答
1

如果您不想在服务器上启用 ftp,另一种选择是使用 RoboCopy 来保持服务器同步。使用这个工具我很幸运。您需要访问cfexecuteColdFusion 标签,并且需要在您的服务器上创建共享。

RoboCopy 是 Windows 附带的可执行文件。您可以在此处此处阅读一些文档。它有一些非常强大的功能,可以设置为将目录内容从一台服务器“镜像”到另一台服务器。在此模式下,它将保持文件夹相同(添加新文件、删除删除文件、复制更新文件等)。这就是我使用它的方式。

基本上,您将在目标服务器上创建一个共享并授予特定用户(可以是本地用户或域用户)的访问权限。在您的源服务器上,您将运行一些 ColdFusion 代码:

  1. 将驱动器逻辑映射到目标服务器
  2. 运行 RoboCopy 实用程序将文件复制到目标服务器
  3. 然后断开映射的驱动器

源服务器上的 ColdFusion 服务将需要访问C:\WINDOWS\system32\net.exeC:\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,我强烈建议您先使用命令行来玩弄选项/功能。然后,一旦你让它按照你的喜好工作,只需将这些选项粘贴到上面的代码中。

于 2013-04-09T13:10:58.483 回答
0

我遇到了类似的问题,这也让我摸不着头脑。我们使用 Active Directory 以及 SERVERSHARE/webroot 的 UNC 路径。除了使用 CFFILE 创建目录外,该应用程序运行良好。我们将 CFService 作为域帐户运行,并且授予了 webroot 文件夹(位于 UNC 服务器上)的权限。同样的域帐户也被用于连接到 IIS 中的 UNC 路径。我什至甚至授予对 webroot 文件夹的完全控制权,但仍然没有运气。

最终,我发现导致问题的原因是 Inetpub 文件夹(我们的 webroot 的父文件夹)已打开共享,但该共享不包括我们的 CFService 域帐户的“读/写”共享。

因此,虽然我们在 Inetpub 上共享并为 Inetpub/webroot 文件夹启用了更强大的用户权限,但共享权限(或缺少共享权限)优先于更精细的 webroot 用户安全权限。

希望这对其他人有帮助。

于 2014-07-11T00:45:43.157 回答