如何測試為本地系統帳戶?(從 Python 訪問遠端文件)
我正在嘗試從 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
您的程式碼對遠端文件進行操作。請注意,您的測試程序報告它擁有F
和R
訪問\\R\EthRelease
.
我通常不會考慮為此目的使用本地系統帳戶。我會考慮在 networkservice 帳戶或託管服務帳戶下執行它以提供此訪問權限。
如果您真的想以本地系統帳戶登錄來測試這一點,有幾種方法可以作為本地系統帳戶打開 shell。
您可以使用PSTools中的PSEXEC並在系統帳戶下打開互動式 cmd 會話:
psexec -i -s cmd.exe
或者啟動以系統帳戶執行的計劃任務 (
at <time> /interactive cmd.exe
)