• Подводные камни WebDav

    Подключили файловый облачный сервер Nextcloud. Все вроде бы хорошо, файлы доступны с любого устройства, через приложение и через веб-интерфейс. Скорость иногда печалит, особенно при открытии каталога с большим количеством файлов, но с этим вряд ли что-то можно сделать.

    Возникла следующая проблема - одной из полезных функций сервера является то, что облачную папку можно подключить по WebDav, как сетевой диск. И тут проблем как бы нет, но Windows (в моем случае, 10) после перезагрузки не подключает диск автоматически. Я не глубокий специалист в этом, но тем не менее заметил несколько моментов:

    1. При перезапуске службы "Веб-клиент" соединение восстанавливается. Кстати, по дефолту эта служба почему-то выключена.
    2. Попытка подключения происходит один раз, в момент, когда компьютер еще не увидел сеть, и, соответственно, ничего не подключается.

    В общем, встала задача написать скрипт, который будет помещен в автозагрузку. При включении компьютера он будет мониторить состояние сети, и когда хост nextcloud станет пинговаться, подключит сетевой диск и перезапустит службу WebClient.

    Одним файлом сделать пока не получилось, и вот почему: 

    • когда мы размонтируем или монтируем диск, эта команда должна выполняться от имени обычного пользователя. Если выполнить ее, как администратор, то пользователь этот диск не увидит
    • перезапуск службы, напротив, должен запускаться с правами админа, так же как и работа с реестром (именно так я собирался добавлять скрипт в автозагрузку)

    Файл connect.cmd, который будет добавляться в автозагрузку:

    @echo off
    net use Y: /delete
    start "" powershell -command "&{start-process -filepath C:autoloadWC_register.cmd -verb RunAs}" %*
    :LOOP
    ping -n 1 mynextcloudhost.ru | find "TTL=" >nul
    if errorlevel 1 (
    ping 127.0.0.1 -n 10 > nul & goto LOOP
    ) else (
    start "" powershell -command "&{start-process -filepath C:autoloadWC_restart.cmd -verb RunAs}" %* & goto connect
    )
    :connect
    Set Login=User121
    Set Password=jkhe3re#
    net use Y: https://mynextcloudhost.ru/remote.php/dav/files/%Login% /user:%Login% %Password% /persistent:no
    if errorlevel 1 ping 127.0.0.1 -n 10 > nul & goto connect

    Да, я захардкодил путь к скрипту, и это нехорошо. Но это я добавил в список дел, с которыми буду разбираться потом.

    В самом начале демонтируется том Y, если он подключен. Запускается скрипт WC_register.cmd, в котором я сделал проверку, есть ли наш скрипт в автозагрузке. Если нет, добавляем в реестр нужную запись. Скрипт запускается с правами администратора.

    Файл WC_register.cmd:

    @echo off
    For /F "tokens=1" %%a in (′reg query "HKLMSOFTWAREMicrosoftWindowsCurrentVersionRun" /v "Netcloud"′) do set regpath=%%a
    If DEFINED regpath ( exit ) Else (
    reg add "HKLMSOFTWAREMicrosoftWindowsCurrentVersionRun" /v Netcloud /t REG_SZ /d "C:autoloadconnect.cmd"
    )
    exit

    Потом мы в цикле пингуем наш хост, пока не добьемся успеха. В этом случае мы вызываем (опять же с правами админа) скрипт WC_restart.cmd, который перезапускает WebClient и передаем выполнение скрипта подпрограмме connect.

    Файл WC_restart.cmd:

    @echo off
    net stop webclient
    net start webclient
    exit

    Потом заново монтируется сетевой диск на томе Y.

    Вот, в принципе, и все. Скрипт работает, и это сейчас самое главное. Немного раздражает, что после перезагрузки компа всплывают prompt-окошки. Это надо будет "допилить" потом. Еще в планах сделать скрипт универсальным, поскольку пользователей много, а хардкодить имя и пароль, а также путь к скрипту - не комильфо. Короче, пока так, а потом буду доделывать.

    P.S. Визивиг режет обратный слэш ( Внимательней с урлами и путем к реестру.




Добавить
Загрузка...

Войти на сайт

Регистрация