Назад | Перейти на главную страницу

как протестировать как локальную системную учетную запись? (доступ к удаленным файлам из Python)

Я пытаюсь получить доступ к некоторым удаленным файлам с сервера веб-приложений. Назовем их серверами 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)