Social Icons

.

суббота, 22 марта 2014 г.

WAS: Чтение файла из подключенной папки (mapping directory)

Проблема:

Есть Web Sphere Application server. На нем развернуто enterprise приложение, которое читает файл расположенный по некоторому (настраиваемому ) пути. Приложение работает корректно и жизнь прекрасна.
В некоторый момент администратор указывает путь к файлу не на локальной машине, а на удаленной. При этом удаленная директория подключена (подмэплена, mapping  ) к данной машине и видна как локальная.
При попытке прочитать (записать) файл получаем ошибку:
"The system cannot find the path specified"
"Системе не удается найти указанный путь"


Причина:

Причина как обычно кроется в сервере приложений. Причем это может быть как WAS, так и совершенно любой другой сервер. Важное условие: он должен быть запущен как сервис операционной системы Windows. При запуске в консольном режиме ошибка не проявится. Дело в том, что подмапленная дирректория подключена к компьютеру с правами для текущего пользователя. Тогда как всякий сервис запускается от имени "Local System account". В этом заключается величайшее благо, так как для запуска сервера (компьютера) и сервиса на нем не требуется логиниться на машину.  Но в этом же заключается и величайшая печаль. Во-первых, без логина на машину удаленная директория не будет подключена вообще. Во-вторых, даже если залогиниться на машину и подмэпить директорию, то обратится к ней не удастся, так как сервер приложений делает обращение от имени другого пользователя.

Решение:

Решений два. Первое (и на мой взгляд неправильное)  это обращаться к удаленному серверу из java программы. Можно использовать библиотеку JCIFS, или подключать удаленную директорию выполняя команду операционной системы "net use ... " прямо из программы, или любым другим способом работать с удаленным сервером. Это плохо, так как при любом из этих вариантов ограничиваются возможности администратора по параметризации системы. За доступ к файлам отвечает операционная система и не следует переписывать ее функционал. Грамотному администратору проще и комфортнее работать с привычными инструментами, а не с мутными настройками.
Второе решение как раз и заключается в корректном администрировании системы. Директория должна быть "устойчиво" (persistents) подключена серверу. При устойчивом подключении она видна для всех пользователей, и даже без логона любого из них.
Делается это следующим образом:.
1. Скачать утилиты Windows Sysinternals (Microsoft).
2. Запустить  cmd.exe (от имени администратора)
3. Перейти в папку с развернутым пакетом утилит.
4. Выполнить команду: "psexec -i -s cmd.exe" В результате откроется новое командное окно.
5. В новом командном окне выполнить команду: "net use z: \\servername\sharedfolder /persistent:yes". Вероятно, в процессе исполнения команды потребуется ввести логин и пароль от удаленной машины.
6. Все. Мы подключили удаленную директорию как диск z. Можно обращаться из любого сервиса.

Замечание:

Удалить такой диск привычными методами не удастся. Для удаления следует выполнить команду: "net use z: /delete"..

Гуру говорят, что можно решить задачу другим способoм через NTFS symbolic link . Как я уже писал - использование стандартного подхода - раздолье для администратора. Я сам не пробовал.

Оригинал

Комментариев нет:

Отправить комментарий

 

Так говорил Учитель:

У хорошо написанной программы есть свой собственный рай, у плохо написанной — свой собственный ад.

Russian Developer

Взгляд его светел, усилия праведны, старания бесплодны, дело безнадежно ...