Копирование файлов по протоколу BITS с помощью Powershell | Windows для системных администраторов

Копирование файлов по протоколу BITS с помощью Powershell

Как правило, в локальных (да и глобальных) сетях файлы между системами передаются с помощью протоколов SMB, FTP или HTTP. Проблема всех этих протоколов – сложности с докачкой больших файлов, которые могут усугубляться проблемами передачи данных по медленному или нестабильному каналу. Кроме того, при копировании файлов по этим протоколам обычно задействуется вся доступная пропускная способность канала связи между сервером и получателем, что может негативно сказаться на производительности сети и работе других приложения (не всегда возможно настроить корректные политики QoS). В этой статье рассмотрим возможность использования протокола BITS и PowerShell для копирования больших файлов по нестабильному или медленному каналу.

Протокол BITS


BITS или Background Intelligent Transfer service — (Фоновая интеллектуальная служба передачи) – это служба Windows, которая используется для передачи файлов между системами. Система обновлений Windows (в т.ч. WSUS сервера), SCCM точки распространения ПО – передают файлы на целевые компьютеры именно по этому протоколу.

С помощью протокола BITS можно передавать файлы между компьютерами (скачивать и закачивать файлы).

Преимущества использования протокола BITS :

  • BITS — интеллектуальный протокол, который при работе способен регулировать используемую полосу канала связи, чтобы не оказывать влияния на другие сетевые приложений. BITS может использовать только незанятую полосу пропускания канала и динамически изменять скорость передачи данных в процессе работы (если другие приложения увеличат утилизацию сети)
  • Загрузка файла может идти в фоновом режиме, незаметно для пользователя
  • Задание BITS в режиме докачки будет автоматически продолжено даже в случае разрывов связи или перезагрузок компьютера
  • На стороне получателя и сервера не обязательно требуется наличие развернутого IIS сервера

Таким образом, BITS является оптимальным протоколом для передачи больших файлов по медленным сетям.

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

Требования к ОС и версии Powershell


Протокол BITS впервые был представлен еще в Windows XP, для управления заданиями BITS в которой можно было использовать утилиту bitsadmin.exe. Утилита все еще поддерживается, однако считается устаревшей. Для управления заданиями BITS предпочтительно использовать специальные командлеты Powershell.

Для работы по рассматриваемому сценарию нам потребуется ОС не ниже Windows Vista или Windows Server 2008 и PowerShell не ниже версии 2.0.

Совет. Возможно использовать и Windows Server 2003. В этом случае придется установить специальное обновлений KB 923845 и PowerShell V2.0

Поддержка BITS требуется как на стороне клиента, так и сервера.

Как скачать файл по протоколу BITS при помощи Powershell

Предположим нам требуется скачать файл, хранящийся на HTTP сервере IIS (http://10.2.2.148/erd65_32.iso). Предполагается, что к ресурсу возможен анонимный доступ (в дальнейшем мы рассмотрим доступ с аутентификацией)

В первую очередь загрузим в сессию PowerShell модуль поддержки BITS:

Import-Module BitsTransfer

После загрузки модуля, список всех доступных команд можно вывести так:

get-command *-BITS*

Модуль Powershell BitsTransfer

Как мы видим, доступно всего 8 командлетов.

Синхронная передача файлов BITS

Чтобы скачать файл по протоколу BITS, воспользуемся командой:

Start-BitsTransfer –source  http://10.2.2.148/erd65_32.iso -destination c:\temp

Start-BitsTransfer - загрузка файла по протоколу BITS

Сообщение This is a file transfer that uses the Background Intelligent Transfer service (BITS) говорит о том, что начата скачка указанного файла по BITS.

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

Асинхронная передача файлов через BITS

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

Start-BitsTransfer -source http://10.2.2.148/erd65_32.iso -destination c:\temp -asynchronous

Загрузка файла по протоколу BITS в асинхронном режиме с докачкой

Важно. По умолчанию Start-BitsTransfer работает с приоритетом Foreground (наивысший из возможных). Предполагается, что закачка, запущенная в этом режиме будет соревноваться с другими процессами за полосу пропускания канала. Чтобы избежать этого, нужно явно указать в качетве аргумента команды любой другой приоритет, например:  -Priority low

Start-BitsTransfer -source http://10.2.2.148/erd65_32.iso -destination c:\temp -asynchronous -Priority low

В этом случае на экран не отображается процесс выполнения команды передачи файла. Статус задания можно получить с помощью команды Get-BitsTransfer:

Get-BitsTransfer | fl

Get-BitsTransfer  - сосояния задания BITSКоманда возвращает статус передача (в данном случае передача окончена Transferred) информацию о количестве переданных байт и общем размере файла, времени создания и завершения задания.

Просмотреть статус всех заданий BITS в табличной форме:

Get-BitsTransfer | select DisplayName, BytesTotal, BytesTransferred, JobState | Format-Table -AutoSize

При использовании асинхронного режима передачи, создается временный файл с расширением TMP (по умолчанию скрыт в проводнике). Чтобы конвертировать его в исходный файл, нужно выполнить команду Complete-BitsTransfer:

Get-BitsTransfer | Complete-BitsTransfer

Complete-BitsTransfer - завершить закачку

Задание закачки BITS после этого считается завершенным и пропадает из списка заданий.

Если сервер, на котором хранится файл, требует аутентификации пользователя, с помощью следующей команды можно вызвать окно, в котором будут указаны данные пользователя для доступа к ресурсу:

Start-BitsTransfer -source http://10.2.2.148/erd65_32.iso -destination c:\temp -asynchronous -Priority low -Authentication NTLM -Credential Get-Credential

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

Import-Module BitsTransfer
$job = Start-BitsTransfer -Source http://10.2.2.148/erd65_32.iso -Destination c:\temp -Asynchronous
while( ($job.JobState.ToString() -eq 'Transferring') -or ($job.JobState.ToString() -eq 'Connecting') )
{
Write-host $Job.JobState.ToString()
$Pro = ($job.BytesTransferred / $job.BytesTotal) * 100
Write-Host $Pro “%”
Sleep 3
}
Complete-BitsTransfer -BitsJob $job

Копирование содержимого каталогов через BITS

Как мы уже говорили, для работы BITS не нужен Web сервер, это означает, что мы можем копировать файлы непосредственно с других Windows компьютеров или общих папок:

Start-BitsTransfer -Source \\msk-rep01\os\rhel-server-7.0-x86_64-dvd.iso -Destination c:\temp -Asynchronous

BitsTransfer не умеет рекурсивно копировать файлы и папки из определённой директории, или файлы, которые используются другими программами. Чтобы скопировать из указанной сетевой папки все файлы с подкаталогами, воспользуемся такой функцией:

Import-Module BitsTransfer
$Source="\\msk-rep01\os\"
$Destination="c:\tmp\"
$folders = Get-ChildItem -Name -Path $source -Directory -Recurse
$job = Start-BitsTransfer -Source $Source\*.* -Destination $Destination -asynchronous -Priority low
while( ($job.JobState.ToString() -eq 'Transferring') -or ($job.JobState.ToString() -eq 'Connecting') )
{
Sleep 3
}
Complete-BitsTransfer -BitsJob $job
foreach ($i in $folders)
{
$exists = Test-Path $Destination\$i
if ($exists -eq $false) {New-Item $Destination\$i -ItemType Directory}
$job = Start-BitsTransfer -Source $Source\$i\*.* -Destination $Destination\$i -asynchronous -Priority low
while( ($job.JobState.ToString() -eq 'Transferring') -or ($job.JobState.ToString() -eq 'Connecting') )
{
Sleep 3
}
Complete-BitsTransfer -BitsJob $job
}

Скрипт копирования содержимого папки по BITS

Таким образом, использование возможностей BITS представляет собой отличную альтернативу традиционному копированию файлов по протоколу SMB. В отличии от последнего, задание BITS на передачу файлов выполняется несмотря на разрывы связи и перезагрузки компьютеров, и не так загружает канал связи, не мешая работе других приложений. BITS будет оптимальным решением при передачи больших файлов с образами систем (iso файлов) и копирования файлов виртуальных машин.

Еще записи по теме: PowerShell
Понравилась статья? Скажи спасибо и расскажи друзьям!
Назад:
Вперед:

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

Оставить комментарий
  1. Ян | 03.12.2015

    Ух ты, как круто! Тема прям как под заказ — сейчас приходится копировать vmdk диски с виртуальными машинами в региональные филиалы по 2 Мбитному каналу. Пользуюсь wget — но по через BITS как вы показали гораздо удобнее и без всяких лишних телодвижений!
    Снимаю шляпу, спс! ;)

    Ответить
  2. RusLAN | 06.12.2015

    Спасибо за статью, познавательно.
    Подскажите если кто знает, передача файлов в размере 2ТВ с помощью BITS возможна?
    Как бы ещё закачку из каталога оформить одной ссылкой (или запуском файла), а то простой менеджер не справится с запуском PowerShell и прочими командами, сам к сожалению скрипты писать не умею..

    Ответить
    • itpro | 07.12.2015

      Сам таких больших файлов не передавал, но не думаю, что есть какие-то ограничения на этот счет. На файлы будут действовать только ограничения файловой системы NTFS.
      Можно конечно к функции закачки файлов по BITS GUI прикрутить, но это уже больше к программистам…

      Упростить задачу для конечных пользователей можно путем оформления этого скрипта например в файл C:\scripts\DownloadBitsFiles.ps1 и запуском его из bat/cmd файла с таким кодом:
      Powershell.exe -executionpolicy remotesigned -File C:\scripts\DownloadBitsFiles.ps1
      Пользователю объяснить, что каталоги откуда и куда скопировать задаются путем редактирования файла DownloadBitsFiles.ps1 в любом текстовом редакторе.

      Ответить
      • RusLAN | 07.12.2015

        Спасибо, будем тестировать..

        Ответить
      • admin.contoso.com | 24.12.2015

        Если задача «тупо запускать», без изменения DownloadBitsFiles.ps1, можно в PowerGUI Script Editir собрать в exe файл.

        Ответить
  3. shs | 24.12.2015

    Ну, вот когда-то писал на ту же тему http://shserg.ru/posts/large_files_download_bits_powershell/

    блин, уже 4 года прошло

    Ответить
    • itpro | 25.12.2015

      :) проблема-то и предложное решение всё еще актуальны.
      Многие админы 4 года назад даже и не думали как много всего можно реализовать на PoSh

      Ответить
  4. Макс | 09.03.2016

    С помощью вашего скрипта запустил скачку большого количества файлов (over 10000) с удаленной системы , скрипт отработал, но при выполнении команды Get-BitsTransfer | select DisplayName, BytesTotal, BytesTransferred, JobState видно что осталось множество незаверешенных закачек BITS со статусом Transferred. Пытаюсь завершить все закачки BITS командой Get-BitsTransfer | Complete-BitsTransfer, но выдает ошибку:
    PS C:\windows\system32> Get-BitsTransfer | Complete-BitsTransfer
    Complete-BitsTransfer : The system cannot find the file specified. (Exception from HRESULT: 0x80070002)
    At line:1 char:20
    + Get-BitsTransfer | Complete-BitsTransfer
    + ~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Complete-BitsTransfer], FileNotFoundException
    + FullyQualifiedErrorId : System.IO.FileNotFoundException,Microsoft.BackgroundIntelligentTransfer.Management.Compl
    eteBitsTransferCommand

    Задания BITS не завершаются и в каталогах куча файлов с расширением TMP, причем размер файлов совпадает с размеров файлов на источнике, т.е. файлы докачались.
    Подскажите, как завершить такие закачки?

    Ответить
    • itpro | 09.03.2016

      Скорее всего есть задания закачки BITS с незавершенным статусом. Показать эти задания можно так:
      Get-BitsTransfer | ? { $_.JobState -ne 'Transferred' }
      Чтобы принудительно их завершить:
      Get-BitsTransfer | ? { $_.JobState -ne 'Transferred' } | Remove-BitsTransfer
      Ну и стандартно завершаем все остальные задания BITS:
      Get-BitsTransfer | Complete-BitsTransfer

      Ответить
  5. PuCtoy | 29.06.2016

    Доброго дня, попробовал на PoSH 5 получил вот такие вот ошибки
    Невозможно вызвать метод для выражения со значением NULL.
    строка:16 знак:8
    + while( ($job.JobState.ToString() -eq ‘Transferring’) -or ($job.JobSta …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

    Complete-BitsTransfer : Не удается проверить аргумент для параметра «BitsJob». Аргумент пустой или имее
    т значение NULL. Укажите непустой аргумент, не имеющий значение NULL, после чего повторите выполнение к
    оманды.
    строка:20 знак:32
    + Complete-BitsTransfer -BitsJob $job
    + ~~~~
    + CategoryInfo : InvalidData: (:) [Complete-BitsTransfer], ParameterBindingValidationExce
    ption
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.BackgroundIntelligentTransfer
    .Management.CompleteBitsTransferCommand

    Ответить
  6. Vasya | 26.08.2016

    Есть программа со времен XP robocopy. С ее помощи можно решить данную задачу.

    Ответить
    • PuCtoy | 26.08.2016

      Спасио конечно за совет по робокопям=) Мне было интересно протестировать данную технологию.
      Я разобрался в чем ошибка была у меня.

      Ответить
Полные правила комментирования на сайте winitpro.ru. Вопросы, не связанные с содержимым статьи или ее обсуждением удаляются.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)



MAXCACHE: 0.27MB/0.00107 sec