Windows

如何測試為本地系統帳戶?(從 Python 訪問遠端文件)

  • December 18, 2013

我正在嘗試從 Web 應用程序伺服器訪問一些遠端文件。我們稱它們為伺服器 M 和 R。兩者都執行 Windows Server(2008 和 2003)。

遠端文件位於每個人都可以讀取的文件共享上的伺服器 R 上(共享權限和安全權限允許Everyone讀取)。這股稱為\\R\EthRelease.

Web 應用程序位於伺服器上M。我在 Tomcat servlet 容器(通過BSF)下執行 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 提示符中對上述任何路徑執行 a 時,它們存在並且是可讀的:

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:\.

有任何想法嗎??這一直把我逼到牆上。我之前嘗試過幾次不同的時間來直接從Cocoon中訪問文件,並遇到了同樣的問題。最近我想’尤里卡!我可以將問題外包給 Python 腳本!Python可以處理它!但到目前為止,還沒有骰子。

正如這些超級使用者問題中所討論的 -提升的命令行提示符無法訪問 Windows 7 中的共享驅動器以及如何從 Windows 7 中的提升程序訪問網路共享?– 驅動器映射與登錄相關聯,因此除非您進行特殊安排,否則 SYSTEM 沒有它們。您可能需要通過 UNC 或通過NET USE您的程式碼對遠端文件進行操作。請注意,您的測試程序報告它擁有FR訪問\\R\EthRelease.

我通常不會考慮為此目的使用本地系統帳戶。我會考慮在 networkservice 帳戶或託管服務帳戶下執行它以提供此訪問權限。

如果您真的想以本地系統帳戶登錄來測試這一點,有幾種方法可以作為本地系統帳戶打開 shell。

您可以使用PSTools中的PSEXEC並在系統帳戶下打開互動式 cmd 會話:psexec -i -s cmd.exe

或者啟動以系統帳戶執行的計劃任務 ( at <time> /interactive cmd.exe)

引用自:https://serverfault.com/questions/562313