Как работать с BITS через Powershell


28 июня 2019


Как работать с Powershell BITS

Powershell BITS (Background Intelligent Transfer Service) - это серия командлетов, которая позволяет скачивать файлы используя одноименный протокол в синхронной и асинхронной загрузке. Особенность в том, что если наш канал забит на 70%, то протокол будет использовать 30% и не будет конкурировать за скорость (по умолчанию такого приоритета нет). BITS давно используется в некоторых службах Microsoft типа WSUS. Этот командлет пришел на замену старой утилиты bitsadmin. Через команды можно установить приоритеты работы, а через политики конкретно скорость. Работает по протоколу HTTP/S (80/443)

Если вы хотите узнать какая у вас версия сначала нужно выполнить импорт модуля:

Import-Module -Name BitsTransfer

Затем получить данные по командлетам: 

Get-Command -Module BitsTransfer

BitsTransfer

Можно так же увидеть работающий сервис:

Get-Service -Name *BITS*

Из доступных методов аутентификации есть для прокси (ключ -ProxyAuthentication) и для конечного сервера (ключ -Authentication):

  • Basic
  • Digest
  • NTLM
  • Negotiate
  • MS Passport

 

Скачивание файлов через Powershell BITS

Для начала скачивания нужно выполнить командлет:

Start-BitsTransfer -Source "\\server\ubuntu.iso" -Destination C:\

Где:
-Source - откуда скачиваем
-Destination - куда

Режим по умолчанию синхронный. Об этом так же говорит подобная картинка:

BITS синхронный режим

Если при синхронной работе у нас или источника будут проблемы с каналом, выключится компьютер например, то процесс прервется без возможности восстановления. Так же будет если мы нажмем Ctr+C. 

Для того что бы выполнить асинхронное скачивание нужно добавить ключ -Asynchronous:

Start-BitsTransfer -Source "\\server\ubuntu.iso" -Destination C:\ -Asynchronous -DisplayName "AsyncDownload"

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

Start-BitsTransfer асинхронное скачивание

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

Get-BitsTransfer | SELECT *

Get-BitsTransfer информация о ходе процесса скачивания

Можно увидеть поля BytesTotal(сколько весит документ) и BytesTransferred (сколько скачено). Если у нас прервется соединение, то в асинхронном режиме никаких уведомлений не будет (в отличие от синхронного). Для того что бы увидеть проблему нужно еще раз запустить этот командлет:

Ошибка скачивания через BITS

Восстановление процесса произойдет либо через 10 минут (по умолчанию) либо в ручную. При этом, всегда когда мы работаем с существующим процессом BITS мы должны передавать объект либо через конвейер (как на примере ниже) либо через переменную. Если не указать имя для процесса, то Resume произойдет для всех:

Get-BitsTransfer -Name "AsyncDownload" | Resume-BitsTransfer -Asynchronous

При этом ключ -Asynchronous нужно указывать обязательно если не желаете синхронную.

Если мы передумали, то возможно выполнить Remove:

Get-BitsTransfer | Remove-BitsTransfer

Если хотим приостановить процесс (подходит и для синхронной загрузке) можно использовать:

Get-BitsTransfer | Suspend-BitsTransfer

Есть вариант скачивания сразу на удаленную машину в обоих режимах, по протоколу HTTP/S:

Start-BitsTransfer -Source "\\Server1\ubuntu.iso" -Destination \\Server2\ -DisplayName "ShipBits"

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

Get-BitsTransfer -Name "AsyncDownload" | Complete-BitsTransfer

Только после этого файл преобразуется из tmp.

Из неописанного есть ключ -UseStoredCredential , который проверит учетные данные в Windows Credential Manager или другие учетки с ключом -Credential.

 

Установка приоритета загрузки в Powershell BITS

У нас доступны 4 вида приоритетов загрузки

  • Foreground - задачи самого приоритетного плана с конкуренцией за канал. Стоит по умолчанию.
  • High - Используется только свободная часть канала, но приоритет среди других задач будет выше.
  • Normal - Только свободная часть канала, но приоритет ниже чем у High
  • Low - Самый низкий приоритет, только свободный канал.

Мы можем использовать этот приоритет во время начала закачивания:

Start-BitsTransfer -Source $path -Destination C:\Test\ -DisplayName "ShipBits" -Asynchronous -Priority Normal

Где:
-Priority - режим приоритета

Указываем приоритет загрузки уже у созданного, рабочего процесса:

Get-BitsTransfer -Name "Test" | Set-BitsTransfer -Priority Low

Как и у Start, так и Set есть ключи для интервала возобновления загрузки:

Get-BitsTransfer -JobId "6e74e59f-31b3-4d51-b7d6-0d40fd4a9d4c" | Set-BitsTransfer -RetryInterval 60 -RetryTimeout 60

Где:
-RetryInterval - То, сколько времени должно пройти для повторной попытки скачивания, в секундах. Минимально 60 секунд. По умолчанию 600 секунд (10 минут).
-RetryTimeout - В течении какого времени эти попытки будут происходить. По умолчанию в течение 14 дней. Если установить 0, то никаких попыток не будет. 

Мы так же можем установить скорость для BITS, но это делается в политиках. Политики находятся:

Computer Configuration -> Administrative Templates -> Network -> Background Intelligent Transfer Service (BITS)

 

Загрузка через Powershell BITS

Для закачивания есть два значения, которые указываются в ключе -TranferType. Всего значения три:
-Download - по умолчанию.
-Upload
-UploadReply - загружает файл и получает копию.

Командлет аналогичный:

Start-BitsTransfer -Source $path -Destination \\Server\Test\ -DisplayName "ShipBits" -Asynchronous -Priority Normal -TransferType Upload

Причем мы не сможем делать Upload для того что бы скачать одновременно скачивать файл и передавать на другой компьютер, а вот с Download можем.

 

Скачивание и загрузка множества файлов

Скачивать мы можем папками с помощью wildcard * :

Start-BitsTransfer -Source \\AD\C$\Folder1\* -Destination C:\Folder2 -Asynchronous

Мы можем скачать только определенный тип, добавив расширение:

Start-BitsTransfer -Source \\AD\C$\Folder1\*.txt -Destination C:\Folder2 -Asynchronous

Если мы используем асинхронное скачивание - не забываем завершить процесс:

Завершение загрузки BITS

Или использовать командлет Add-BitsFile, который позволяет добавлять файлы во время скачивания:

Get-BitsTransfer | Add-BitsFile -Source \\CL1\D$\Photo\*.jpg -Destination C:\s

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

Get-ChildItem -Path $source |
foreach {
$destination =  "\\AD\C$\Folder3\$($_.name)"
$bits = Start-BitsTransfer -Source $($_.Fullname) -Destination $destination -TransferType Upload -Asynchronous
}

В документации Microsoft есть вариант использования CSV файлов через конвейер с Add-BitsFile, но у меня так и не сработало. Возможно или неверная документация.

На веб сервере BIts можно включить тут:

Включение Bits

Включение BITS

...

Теги: #powershell


Популярные тэги
О блоге
Этот блог представляет собой конспекты выученного материала, преобретенного опыта и лучшие практики в системном администрировании и программировании.