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

16.05.19

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
PowerShell скрипт для загрузки файлов по технологии BITS-transfer
.zip 1,94Kb
24
24 Скачать (1 SM) Купить за 1 850 руб.

При работе на серверах в режиме подключения 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С v8.3 Конфигурации 1cv8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя.

8400 руб.

20.08.2024    9207    72    32    

81

Инструменты администратора БД Роли и права Системный администратор Программист Пользователь 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, пытаясь понять какими правами они обладают? Вы все время смотрите права в конфигураторе или отчетах чтоб создать нормальные профили доступа? Вы хотите наглядно видеть какие права дает профиль и редактировать все в простом виде? А может хотите просто указать подсистему и дать права на просмотр и добавление на объекты и не лезть в дебри прав и чтоб обработка сама подобрала нужные роли? Все это теперь стало возможно! Обновление от 18.09.2024, версия 1.2

16800 руб.

06.12.2023    9227    43    5    

74

SALE! %

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

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

15000 10000 руб.

10.11.2023    10833    40    27    

64

SALE! %

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

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

4800 3840 руб.

14.01.2013    188968    1144    0    

915

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

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

14400 руб.

29.04.2020    33002    107    152    

73

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

Брандмауэр для сервера 1С включает в себя управление возможностью начала и возобновления сеансов пользователей по различным условиям, ограничение общего числа возможных сеансов для работы с информационной базой, резервирование возможности работы с информационной базой определенных польззователей, запрет запуска нескольких сеансов для пользователя, журнализация событий начала (возобновления) и завершения (гибернации) сеансов, ведение списка активных сеансов для информационных баз кластера серверов

3600 руб.

06.02.2017    32213    34    18    

50

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

Данная разработка позволит решить вопрос с резервным копированием Ваших баз в автоматическом режиме, расположенных на сервере 1С. Система умеет ставить блокировки на вход, блокировать фоновые задания, принудительно отключать сеансы пользователей. И все это система делает в автоматически при создании бэкапа (или через команду). Выгрузка происходит в родной формат 1С - .dt. Так же система умеет архивировать данные выгрузки с установкой пароля. Умеет менять расширение файла zip или dt на любое указанное вами, что позволит сохранить выгрузки от шифровальщика. Может удалять старые копии выгрузок, оставляя указанное количество резервных копий, начиная с самой поздней. Только для WINDOWS!

6000 руб.

06.11.2012    73045    627    45    

86

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

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

4200 руб.

10.11.2015    62956    94    59    

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

Просто сохраните файлы в папочку на сервере и они через некоторое время перекочуют на ваш компьютер.
То же самое в обратную сторону.
torbeev; VKislitsin; +2 Ответить
3. VKislitsin 1015 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 408 24.01.22 17:37 Сейчас в теме
Мне пришлось, после определения переменных, добавить иструкцию
Import-Module BitsTransfer
иначе выдавало ошибку о не известном командлете. не стал углублятся почему так.
Пишу, может комуто будет полезным
5. пользователь 23.11.22 12:48
Сообщение было скрыто модератором.
...
9. xlives 24.07.24 20:35 Сейчас в теме
При настройках по умолчанию, следующая попытка после неудачной предпринимается через 10 минут. Чтобы не ожидать автоматического возобновления, можно запустить скрипт повторно.

Чтобы не ждать 10 минут, которые по умолчанию, можно их переопределить при создании задания, дописав параметр:
-RetryInterval 60

60 - это минимально допустимое значение в секундах. Т.е. вместо 10 минут он будет ждать 1 минуту.
Итого строчка будет выглядеть так:
$job = Start-BitsTransfer -Source $sourceDialog.FileNames -Destination $destFolders -Asynchronous -DisplayName $jobName -RetryInterval 60
10. xlives 24.07.24 21:25 Сейчас в теме
Точнее вот так (в предыдущем сообщении случайно вставил строчку из платной версии скрипта):
$job = Start-BitsTransfer -Source $source -Destination $destination -Asynchronous -DisplayName $jobName -RetryInterval 60
VKislitsin; +1 Ответить
11. xlives 01.08.24 12:58 Сейчас в теме
Часто бывает, что RDP подключение к серверам заказчика является каскадным, т.е. сначала мы подключаемся по RDP к терминальному серверу, а уже с него подключаемся по RDP к другому серверу, например, к SQL-серверу, с которого и надо скачать бэкап базы данных большого размера. При этом наш локальный диск пробросится только до терминального сервера, а не до конечного SQL-сервера, с которого нужно скачивать файл. На конечный SQL-сервер пробросится только локальный диск терминального сервера. Как же в этом случае скачивать файл? Есть вариант сначала скачать файл на терминальный сервер, а уже с него - на наш компьютер. Но, как правило, на терминальном сервере для этого банально не хватает места на диске. Да и по времени это будет долго. Хотелось бы скачивать напрямую с конечного сервера на наш компьютер. И такой вариант нашёлся! В нашем примере мы просто расшариваем на чтение папку с бэкапом базы, и тогда к ней можно будет обращаться по сетевому имени вида \\SQL-Server\BackUp. Далее на терминальном сервере запускаем наш скрипт и в качестве источника выбираем файл с этой сетевой расшаренной папки, в качестве приёмника указываем наш проброшенный локальный диск. Скрипт будет перекидывать файл с шары на шару, т.е. напрямую с сетевой папки SQL-сервера на локальный диск нашего компьютера. Надеюсь, кому-то будет полезно.
maxpower; VKislitsin; +2 Ответить
Оставьте свое сообщение