如何以本地系统帐户进行​​测试?(从 Python 访问远程文件)

如何以本地系统帐户进行​​测试?(从 Python 访问远程文件)

我正在尝试从 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

答案2

我通常不会考虑使用本地系统帐户来实现此目的。我会考虑在网络服务帐户或托管服务帐户下运行它以提供此访问权限。

如果您确实想以本地系统帐户登录来测试这一点,有几种方法可以以本地系统帐户身份打开 shell。

您可以使用执行命令发现于工具并在系统账户下打开交互式cmd会话:psexec -i -s cmd.exe

或者启动以系统帐户运行的计划任务(at <time> /interactive cmd.exe

相关内容