Загрузка-выгрузка файлов по RDP с докачкой

16.05.19

База данных - Инструменты администратора БД

PowerShell скрипт для загрузки/выгрузки больших файлов в RDP-сессии с использованием технологии BITS-transfer.

Скачать исходный код

Наименование Файл Версия Размер
PowerShell скрипт для загрузки файлов по технологии BITS-transfer
.zip 1,94Kb
22
.zip 1,94Kb 22 Скачать

При работе на серверах в режиме подключения Remote Desktop Connection (RDP) постоянно возникает необходимость копирования/перемещения файлов между локальной и удаленной машиной. Для этого в подключении настраивается "проброс" дисков и буфера обмена локальной машины. Файлы копируются обычным способом в проводнике удаленной машины или просто через буфер обмена.

Такой "обычный" метод прекрасно работает до тех пор, пока файлы не оказываются сравнительно большими или соединение недостаточно стабильным. А большинство файлов, которые необходимо скопировать, как раз и являются большими: дистрибутивы, конфигурации, выгрузки баз, архивы логов, бэкапы и т.д. Загрузка / выгрузка таких файлов не всегда проходит успешно. Малейшая нестабильность канала приводит к обрыву передачи с ошибкой. Иногда приходится возобновлять передачу вновь и вновь и вновь, что может длиться часами. Особенно, если размер файла составляет несколько Гигабайт.

И если на серверах, которыми владеете Вы или Ваша Компания, возможны другие варианты организации файлообмена, кроме как по RDP-соединению, то к серверам, находящихся в инфраструктуре Заказчика, чаще всего есть только RDP доступ (к тому же, в большинстве случаев, через VPN) и организация альтернативных способов требует согласования со службой информационной безопасности Заказчика.

Однажды, после того как выгрузка нескольких гигабайт архивированных логов ТехЖурнала с продуктивной системы в контуре Заказчика для отправки на контроль в ЦКТП, продолжалась у меня практически весь рабочий день с десятком реконнектов и возобновлений с начала, пришлось заняться поиском решения. И оно было найдено.

Сразу оговорюсь, что речь идет о работе в Windows - системах. Как локальных так и удаленных машин.

BITS-Transfer

Background Intelligent Transfer Service, или по-русски, "Фоновая интеллектуальная служба передачи (BITS)" - это, упрощенно и в двух словах - транспортная система, которую Windows использует для загрузки и распространения обновлений. Работает в фоновом режиме, использует свободную полосу пропускания сети, самостоятельно восстанавливает работу после обрывов связи, отключений и перезагрузок.

Целью заметки не является подробное описание данного протокола. В Сети достаточно материала, в том числе и на русском языке. Сосредоточимся лишь на практическом применении в отношении RDP-сессий.

Согласно описанию от Microsoft, данный сервис предназначен для скачки/закачки файлов через HTTP-соединение и по SMB в/из папки общего доступа.

Однако, как показали эксперименты, ничто не мешает копировать файлы и в рамках локальной файловой системы, скажем с одного диска на другой, или даже в соседний каталог. В ситуации с RDP-сессией, "проброшенный" в удаленную систему диск нашего компьютера и будет для BITS-transfer таким же каталогом общего доступа, как и SMB (эти диски отображаются в системе как сетевые вида \\tsclient\D). Т.е. нам не понадобится никаких дополнительных портов и разрешений.

Таким образом, главными достоинствами BITS-transfer применительно к текущей задаче, будут:

  • Автоматическое возобновление докачки при обрыве связи или перезагрузке компьютера;
  • Передача в фоновом режиме, без помех для работающего пользователя, с "бережным" отношением к пропускной способности канала;

Для управления службой нет каких-либо визуальных средств. Возможны два варианта управления:

Реализация

При решении задачи я воспользовался реализацией скрипта на PowerShell 

Для примера будем загружать с локальной машины на удаленную дистрибутив сервера 1С, т.к. доступа к Интернет с самого сервера нет. 

Ниже привожу основную, рабочую часть скрипта. Достаточно указать в параметрах -Source и -Destination свои пути к файлам. Оба пути - с удаленной машины. Один указывает на локальный диск, второй - на "проброшенный" (\\tsclient)

Служба может работать в обе стороны, т.е. как скачивать на удаленную машину с локальной, так и закачивать с удаленной на локальную. Достаточно поменять местами значения параметров -Source и -Destination.

Запускать скрипт нужно на удаленной машине, т.е. в RDP-сессии.

$source = "\\tsclient\G\_temp\windows64_8_3_12_1790.rar"
$destination = "E:\temp" 
$jobName = "MyBitsTransferJob"

$job = Get-BitsTransfer -Name $jobName -ErrorAction SilentlyContinue -ErrorVariable ProcessError;
if ($ProcessError) {
    $job = Start-BitsTransfer -Source $source -Destination $destination -Asynchronous -DisplayName $jobName
} else {
    Resume-BitsTransfer -BitsJob $job -Asynchronous
}
while( ($job.JobState.ToString() -eq 'Transferring') -or ($job.JobState.ToString() -eq 'Connecting') ) {
    Write-host $Job.JobState.ToString()
    $Percent = ($job.BytesTransferred / $job.BytesTotal) * 100
    Write-Host $Percent.tostring("0.00") “%”
    Sleep 3
}
if ($job.JobState.ToString() -eq 'Transferred') {
    Complete-BitsTransfer -BitsJob $job
    Write-Host "Передача завершена."
    Write-Host "Нажмите любую клавишу для выхода..."
    $null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
}

 

Совет: самый простой способ добавить путь к файлу - найти его в проводнике, выделить, нажать Shift+ПКМ и выбрать "Копировать как путь". Что сделать дальше со строкой в буфере, полагаю и так все знают.

После запуска скрипт демонстрирует прогресс операции в процентах.

Можно в любой момент прервать его выполнение по Ctrl-C или закрыв окно. При следующем запуске через несколько минут можно заметить что процент выполнения будет больше того, на котором был произведен обрыв. Таким же образом будет возобновлена передача файлов после повторного соединения при обрыве связи или отключении сессии. При настройках по умолчанию, следующая попытка после неудачной предпринимается через 10 минут. Чтобы не ожидать автоматического возобновления, можно запустить скрипт повторно.

Если оставить задачу "без присмотра", т.е. без работающего скрипта, то загрузка выполнится, но загружаемые файлы не появятся в целевом каталоге. Вернее, в нём будут временные файлы вида "BIT5F71.tmp".  Для того, чтобы в каталоге назначения объявились "правильные" файлы, необходимо выполнить "финализацию", при которой созданные временные файлы будут переименованы и задание службы будет удалено.

Сделать это можно, просто повторно запустив скрипт. Либо выполнить в консоли: 

PS C:\> Get-BitsTransfer -Name "MyBitsTransferJob" | Complete-BitsTransfer

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

Как уже было показано, при завершении скрипта по Ctrl-C или закрытием окна и даже выходом из сессии, задача BITS-transfer не удаляется. 

При необходимости отменить задачу, сделать это можно следующим образом:

PS C:\> Get-BitsTransfer -Name "MyBitsTransferJob" | Remove-BitsTransfer
 
Возможные ошибки

При первом запуске скрипта может возникнуть ошибка вида:

.\FileTransfer_Resume.ps1 : Невозможно загрузить файл C:\...\FileTransfer_Resume.ps1, так как выполнение сценариев отключено в этой системе. Для получения дополнительных сведений см. about_Execution_Policies по адресу https:/go.microsoft.com/fwlink/?LinkID=135170.

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

PS C:\> Set-ExecutionPolicy RemoteSigned

 

Файл для загрузки

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

 

Документация

BITS, PowerShell comandlets (Microsoft, eng)

 

Дисклаймер

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

BITS-Transfer PowerShell

См. также

Автоподбор ролей для профилей и групп доступа в любых типовых базах 1С УТ 11, КА 2, ERP2, Розница 2/3, УНФ 16/3, БП 3, ЗУП 3 и подобных (УФ, Платформа 8.3.14+)

Инструменты администратора БД Роли и права 8.3.14 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Документооборот 1С:Зарплата и кадры государственного учреждения 3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Роли… Вы тратите много времени и сил на подбор ролей среди около 2400 в ERP или 1500 в Рознице 2, пытаясь понять какими правами они обладают? Вы все время смотрите права в конфигураторе или отчетах чтоб создать нормальные профили доступа? Вы хотите наглядно видеть какие права дает профиль и редактировать все в простом виде? А может хотите просто указать подсистему и дать права на просмотр и добавление на объекты и не лезть в дебри прав и чтоб обработка сама подобрала нужные роли? Все это теперь стало возможно! Обновление от 15.12.2023, версия 1.1.

14400 руб.

06.12.2023    3601    18    1    

40

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 руб.

10.11.2023    4288    12    2    

36

SALE! %

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 2280 руб.

14.01.2013    178663    1084    0    

862

Ускоренное проведение документов (x4), устранение ошибок 60/62 счетов и зачет авансов (Бухгалтерия 3.0)

Закрытие периода Инструменты администратора БД Корректировка данных Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение «Оперативное проведение» в 4 раза уменьшает время проведения документов и закрытия месяца. Является комплексным решением проблем 62 и 60 счетов. Оптимизирует проведение при включенной функциональной опции «Раздельный учет НДС». Используется в более 10 организациях уже 2 года. Совместимо с конфигурацией Бухгалтерия 3.0 (+КОРП).

14400 руб.

29.04.2020    27939    82    146    

61

Система хранения присоединенных файлов в томах на диске

Инструменты администратора БД Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием Платные (руб)

Конфигурация Комплексная автоматизация 1.1 (и УПП 1.3 тоже) хранит файлы и изображения в справочнике Хранилище дополнительной информации в реквизите Хранилище типа ХранилищеЗначений. Та же история с ВложениямиЭлектроннойПочты. Но при этом присоединенные файлы в Электронном документообороте хранит в томах на диске. Эта доработка позволяет использовать стандартный механизм хранения файлов, изображений и вложений электронных писем в томах на диске. При этом можно разделить тома хранения по объектам конфигурации.

4200 руб.

10.11.2015    61538    91    59    

74

"Менеджер потоков 2.1": УПП: "Восстановление партий"

Инструменты администратора БД Платформа 1С v8.3 1С:Управление производственным предприятием Россия Бухгалтерский учет Управленческий учет Платные (руб)

Как оптимизировать то, что, считалось, не поддается оптимизации? Как повысить доступность базы данных? Как проводить самую «времяемкую» операцию не по паре раз в неделю, а по несколько раз в день*? Ответ есть!

20000 руб.

12.09.2019    11857    5    9    

7

Конфигурация Session Monitor

Мониторинг Инструменты администратора БД Платформа 1С v8.3 Россия Платные (руб)

Конфигурация Session Monitor предназначена для мониторинга сервера 1С с целью отслеживания чрезмерной нагрузки от конкретных сеансов и скорости реакции рабочих процессов.

1500 руб.

01.12.2020    14403    34    0    

49

Хранилище файлов на SQL

Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Управленческий учет Платные (руб)

Привязка файлов / сканов к объектам 1С с сохранением их на SQL-сервере

12000 руб.

09.10.2019    11172    5    8    

9
Вознаграждение за ответ
Показать полностью
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. o.nikolaev 212 16.05.19 09:28 Сейчас в теме
Отличная штука. Очень помогла на проекте.
2. segatron 27.07.20 04:53 Сейчас в теме
Интересное решение. Автор однозначно молодец.
Но данную задачу можно решить гораздо проще - используйте Resilio Sync (он же btsync в девичестве).
1. Установите данное ПО на сервер (лучше как службу) и на свой комп.
2. Свяжите между собой папки, которые надо синхронизировать.
3. В настройках снимите галочку на "Сохранять удаленные файлв в архив".

Просто сохраните файлы в папочку на сервере и они через некоторое время перекочуют на ваш компьютер.
То же самое в обратную сторону.
torbeev; VKislitsin; +2 Ответить
3. VKislitsin 968 27.07.20 08:45 Сейчас в теме
(2) Вы конечно же правы: существуют и другие способы. Но большинство из них затруднительно применить в инфраструктуре Заказчика, где каждую устанавливаемую программу или открываемый порт нужно согласовывать со службой информационной безопасности. У меня на этот счет специально абзац приведен.
Описанным скриптом пользуюсь уже несколько лет практически везде, где требуется скачать или залить что-нибудь больше 100 Мб (логи, конфигурации, бэкапы, дистрибутивы и т.д.). Он у меня вместе с набором портабельных программ всегда наготове.

В любом случае, спасибо за предложенный вариант!
6. user1876031 23.11.22 12:50 Сейчас в теме
(2) Resilio на Windows Server 2012 не устанавливается, а решение автора работает
7. segatron 28.11.22 22:28 Сейчас в теме
(6) Версия 2.6.4.1344 прекрасно устанавливается и работает
8. user1876031 29.11.22 09:50 Сейчас в теме
Windows Server поддерживают только платные версии Resilio
4. stoptime 401 24.01.22 17:37 Сейчас в теме
Мне пришлось, после определения переменных, добавить иструкцию
Import-Module BitsTransfer
иначе выдавало ошибку о не известном командлете. не стал углублятся почему так.
Пишу, может комуто будет полезным
5. пользователь 23.11.22 12:48
Сообщение было скрыто модератором.
...
Оставьте свое сообщение