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