我试图从Web应用程序服务器访问一些远程文件。 我们称之为服务器M和R.两者都运行Windows Server(2008和2003)。
远程文件位于服务器R上的Everyone可以读取的文件共享(共享权限和安全权限允许Everyone可以读取)。 这个份额被称为\\R\EthRelease 。
Web应用程序在服务器M 。 我正在Tomcat servlet容器(通过BSF )下运行一个Python(真正的Jython)脚本,以便尝试访问R上的远程文件。
但不pipe我做什么,脚本都看不到远程共享文件夹。 例如,我使用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.xxx\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.xxx\EthRelease" exists="False" accessF="False" accessR="False"/>
相比之下,当我在服务器M上的CMD提示符的上述path上执行dir命令时,它们存在且可读:
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),并且能够成功访问相同的networking共享。
一个可能的区别是,servlet容器Tomcat作为服务器M上的本地SYSTEM用户运行,而在CMD shell中,我以另一个用户身份login。 但如前所述, Everyone可以访问远程文件共享,所以不应该有所作为,对吧? 有什么办法可以以SYSTEM用户身份login,并testing我是否能够在该状态下访问远程文件共享?
另一个可能的区别是,servlet容器或BSF可能施加某种沙箱限制,阻止我访问servlet容器之外的文件。 但是这没有发生,因为我可以检查C:\ 。
有任何想法吗?? 这已经把我推上了墙。 我早些时候尝试了几次不同的时间来直接从Cocoon中访问文件,并打到相同的墙上。 最近我以为'尤里卡! 我可以将问题外包给Python脚本! Python可以处理它! 但到目前为止,没有骰子。
正如在这些超级用户问题中所讨论的 – 提升命令行提示无法访问Windows 7中的共享驱动器,以及如何 在Windows 7中 从提升的进程访问networking共享? – 驱动器映射与login相关联,所以除非特别安排,否则系统不具有它们。 您可能需要通过UNC对远程文件进行操作,或者通过执行代码中的NET USE操作。 请注意,您的testing程序报告它具有对\\R\EthRelease F和R访问。
我通常不会考虑使用本地系统帐户来达到这个目的。 我会考虑在networking服务帐户或托pipe服务帐户下运行它以提供此访问。
如果您真的想以本地系统帐户login进行testing,有几种方法可以打开一个shell作为本地系统帐户。
您可以使用PSTools中find的PSEXEC并在系统帐户下打开交互式cmd会话: psexec -i -s cmd.exe
或者启动一个以系统帐户运行的计划任务( at <time> /interactive cmd.exe )