Я пытаюсь получить доступ к некоторым удаленным файлам с сервера веб-приложений. Назовем их серверами M и R. Оба работают под управлением Windows Server (2008 и 2003).
Удаленные файлы находятся на сервере R в общей папке, доступной для чтения всем (разрешения общего доступа и разрешения безопасности позволяют Everyone
читать). Эта доля называется \\R\EthRelease
.
Веб-приложение находится на сервере M
. Я запускаю сценарий Python (на самом деле Jython) в контейнере сервлетов Tomcat (через BSF), чтобы попытаться получить доступ к удаленным файлам на 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
на любом из указанных выше путей в приглашении CMD на сервере M они существуют и доступны для чтения:
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) и могу успешно получить доступ к той же сетевой папке.
Одно из возможных отличий заключается в том, что контейнер сервлетов Tomcat работает как локальный пользователь SYSTEM на сервере M, а в оболочке CMD я вошел в систему как другой пользователь. Но, как упоминалось ранее, Everyone
имеет доступ к удаленному файловому ресурсу, так что это не имеет значения, верно? Есть ли способ войти в систему как пользователь SYSTEM и проверить, могу ли я получить доступ к удаленному файловому ресурсу в этом состоянии?
Другое возможное отличие состоит в том, что контейнер сервлетов или BSF может налагать какие-то ограничения песочницы, не позволяя мне получать доступ к файлам за пределами контейнера сервлетов. Но этого не происходит, потому что я могу проверить C:\
.
Любые идеи?? Это вело меня к стене. Раньше я несколько раз пробовал получить доступ к файлам прямо изнутри. Кокон, и ударился о такую же стену. Недавно я подумал: «Эврика! Я могу передать проблему скрипту Python! Python справится с этим! ' Но пока без кубиков.
Как обсуждалось в этих вопросах суперпользователя - Командная строка с повышенными привилегиями не может получить доступ к общим дискам в Windows 7 и Как получить доступ к сетевым ресурсам из процесса с повышенными привилегиями в Windows 7? - сопоставления дисков связаны с логином, поэтому в SYSTEM их не будет, если вы не сделаете особые меры. Возможно, вам придется работать с удаленными файлами с помощью UNC или выполнив NET USE
из вашего кода. Обратите внимание, что ваша тестовая программа сообщает, что она F
и R
доступ к \\R\EthRelease
.
Обычно я бы не стал использовать для этой цели учетную запись локальной системы. Я бы посмотрел на запуск его под учетной записью сетевой службы или под учетной записью управляемой службы, чтобы обеспечить такой доступ.
Если вы действительно хотите войти в систему как локальную системную учетную запись, чтобы проверить это, есть несколько способов открыть оболочку как локальную системную учетную запись.
Ты можешь использовать PSEXEC найдено в PSTools и откройте интерактивный сеанс cmd под системной учетной записью: psexec -i -s cmd.exe
Или запустите запланированное задание под системной учетной записью (at <time> /interactive cmd.exe
)