我正在尝试从 Web 应用程序服务器访问一些远程文件。我们将它们称为服务器 M 和 R。两者都运行 Windows Server(2008 和 2003)。
远程文件位于服务器 R 上的文件共享中,每个人都可以读取(共享权限和安全权限允许Everyone
读取)。此共享称为\\R\EthRelease
。
Web 应用程序位于服务器上M
。我在 Tomcat servlet 容器下运行 Python(实际上是 Jython)脚本(通过背侧筋膜) 以尝试访问 上的远程文件R
。
但无论我做什么,剧本无法看到远程共享文件夹。例如我使用如下 Python 代码:
# Note, R: is a mapped network drive pointing to \\R\EthRelease
for file in ['C:', 'C:\\', 'C:\\Users', 'R:', 'R:\\',
r"\\R\EthRelease", r"\\172.x.x.x\EthRelease"]:
output.append(" <accessCheck dir='%s' exists='%s' accessF='%s' accessR='%s'/>\n" %
(file, os.path.exists(file), os.access(file, os.F_OK),
os.access(file, os.R_OK)))
并且脚本指出存在的唯一文件夹是C:\
和C:\Users
:
<accessCheck dir="C:" exists="False" accessF="False" accessR="False"/>
<accessCheck dir="C:\" exists="True" accessF="True" accessR="True"/>
<accessCheck dir="C:\Users" exists="True" accessF="True" accessR="True"/>
<accessCheck dir="R:" exists="False" accessF="False" accessR="False"/>
<accessCheck dir="R:\" exists="False" accessF="False" accessR="False"/>
<accessCheck dir="\\R\EthRelease" exists="False" accessF="True" accessR="True"/>
<accessCheck dir="\\172.x.x.x\EthRelease" exists="False" accessF="False" accessR="False"/>
相比之下,当我dir
在服务器 M 上的 CMD 提示符下对上述任何路径执行操作时,它们都存在并且可以读取:
C:\Users\me>dir r:\
Volume in drive R is GIS
Volume Serial Number is ...
Directory of r:\
12/03/2012 09:18 AM <DIR> .
12/03/2012 09:18 AM <DIR> ..
07/25/2013 08:51 AM <DIR> EGI
12/17/2013 05:46 AM <DIR> maps
0 File(s) 0 bytes
4 Dir(s) 48,192,491,520 bytes free
C:\Users\me>
我已经尝试使用 Jython stable 2.5.3 和 Jython beta 2.7b1 进行此操作,并得到了相同的结果。我知道这不仅仅是 Python 问题,因为我在笔记本电脑上运行了类似的命令(使用 Python 3.3),并且能够成功访问相同的网络共享。
一个可能的区别是,servlet 容器 Tomcat 在服务器 M 上以本地 SYSTEM 用户身份运行,而在 CMD shell 中我以另一个用户身份登录。但如前所述,Everyone
可以访问远程文件共享,所以这应该没什么区别,对吧?我能否以 SYSTEM 用户身份登录并测试我是否能够在该状态下访问远程文件共享?
另一个可能的区别是 servlet 容器或 BSF 可能会施加某种沙盒限制,阻止我访问 servlet 容器之外的文件。但这种情况不会发生,因为我可以检查C:\
。
有什么想法吗?这让我很抓狂。我之前曾尝试过几次直接从内部访问文件茧,并遇到了同样的障碍。最近我想“尤里卡!我可以把这个问题外包给 Python 脚本!Python 可以处理它!”但到目前为止,还没有成功。
答案1
正如这些超级用户问题中所讨论的那样 -提升的命令行提示符无法访问 Windows 7 中的共享驱动器和如何在 Windows 7 中从提升的进程访问网络共享?– 驱动器映射与登录名相关联,因此除非您做出特殊安排,否则 SYSTEM 不会拥有它们。您可能需要通过 UNC 或从NET USE
代码中执行 来操作远程文件。请注意,您的测试程序报告它具有 的访问F
权限。R
\\R\EthRelease