Skopiuj duże pliki przez sieć za pomocą BITS i PowerShell

W sieciach lokalnych (i globalnych) pliki między systemami są zwykle przesyłane przy użyciu protokołów SMB, FTP lub HTTP. Problemem we wszystkich tych protokołach jest trudność pobierania dużych plików, którą mogą pogarszać problemy z transmisją danych w wolnym lub niestabilnym kanale. Podczas kopiowania plików przy użyciu tych protokołów zwykle wykorzystywana jest cała dostępna przepustowość kanału komunikacyjnego między serwerem a odbiorcą, co może niekorzystnie wpłynąć na wydajność sieci i inne aplikacje (nie zawsze jest możliwe skonfigurowanie prawidłowych zasad QoS na poziomie sprzętu sieciowego). W tym artykule rozważymy możliwość użycia protokołu. Bity i cmdlety Powerhell aby skopiować duże pliki przez sieć za pomocą niestabilnego lub wolnego kanału.

Treść

  • Protokół BITS
  • BITS: Wymagania dotyczące wersji systemu operacyjnego i programu PowerShell
  • Jak pobrać plik przy użyciu protokołu BITS przy użyciu programu PowerShell
  • Synchroniczne przesyłanie plików między komputerami za pomocą BITS
  • Używanie usługi BITS do asynchronicznego kopiowania dużych plików przez sieć
  • Kopiowanie całej zawartości udziału sieciowego przez BITS
  • Przesyłanie pliku na serwer HTTP za pomocą PowerShell i BITS

Protokół BITS

Bity lub Tło Inteligentny Przeniesienie usługa - (Usługa inteligentnego transferu w tle) to usługa systemu Windows służąca do przesyłania plików między systemami. Korzystając z protokołu BITS, możesz przesyłać zarówno pobieranie, jak i przesyłanie plików. Zgodnie z tym protokołem komputery pobierają pliki z serwerów podczas wykonywania automatycznej aktualizacji systemu Windows (w tym podczas pobierania aktualizacji z serwera WSUS), podczas odbierania programów z punktów dystrybucji SCCM itp..

Korzyści z protokołu BITS:

  • BITS to inteligentny protokół, który podczas pracy może regulować używane pasmo kanału komunikacyjnego, aby nie wpływać na inne aplikacje i usługi sieciowe. BITS może korzystać tylko z nieprzydzielonej przepustowości kanału i dynamicznie zmieniać szybkość przesyłania danych podczas pracy (jeśli inne aplikacje zwiększają obciążenie sieci, BITS może zmniejszyć szybkość przesyłania danych przez sieć);
  • Pobieranie pliku może przebiegać w tle, niewidocznie dla użytkownika;
  • Zadanie BITS w trybie wznawiania będzie automatycznie kontynuowane, nawet jeśli kanał komunikacji między komputerem a klientem ulegnie awarii lub po ponownym uruchomieniu komputera;
  • W dowolnym momencie możesz wstrzymać lub wznowić pobieranie przez BITS bez utraty danych;Uwaga. Możliwość ponownego uruchomienia procedury kopiowania plików przez sieć jest również dostępna w narzędziu robocopy.exe, który pozwala wznowić pobieranie pliku w przypadku awarii połączenia.
  • BITS pozwala zarządzać priorytetami zadań rozruchowych;
  • Przesyłanie plików między komputerami odbywa się na portach 80 (HTTP) lub 443 (HTTPS), więc nie trzeba otwierać dodatkowych portów w zaporach. Na przykład 445 portów kopiowanych podczas korzystania z protokołu SMB (nie zapominaj, że istnieje wiele luk w starszych wersjach protokołu SMB 1.0);
  • Po stronie odbiorcy i serwera wdrożony serwer IIS nie jest wymagany.

Dlatego BITS jest optymalnym protokołem do przesyłania dużych plików w wolnych i niestabilnych sieciach (kanał satelitarny, połączenie GPRS itp.).

BITS: Wymagania dotyczące wersji systemu operacyjnego i programu PowerShell

Protokół BITS został po raz pierwszy wprowadzony w systemie Windows XP do zarządzania zadaniami BITS, w których można było użyć tego narzędzia bitsadmin.exe. Narzędzie jest nadal obsługiwane, ale jest przestarzałe. Aby zarządzać zadaniami BITS, lepiej jest używać specjalnych poleceń cmdlet programu PowerShell.

Aby działać w tym scenariuszu, potrzebujemy systemu operacyjnego nie niższego niż Windows Vista lub Windows Server 2008 i PowerShell nie niższego niż wersja 2.0. Nowoczesne wersje systemu Windows 10 i Windows Server 2016/2012 R2 w pełni obsługują protokół BITS.

Wskazówka. Możliwe jest użycie systemu Windows Server 2003. W takim przypadku będziesz musiał zainstalować specjalne aktualizacje KB 923845 i PowerShell V2.0.

Obsługa BITS jest wymagana zarówno po stronie klienta, jak i serwera.

Jak pobrać plik przy użyciu protokołu BITS przy użyciu programu PowerShell

Załóżmy, że chcesz pobrać duży plik ISO przechowywany na serwerze HTTP IIS (_http: //10.2.2.148/erd65_32.iso).

Zakłada się, że anonimowy dostęp do tego adresu URL jest dozwolony (w przyszłości rozważymy dostęp do adresu URL z uwierzytelnieniem).

Najpierw załaduj moduł obsługi BITS do sesji PowerShell:

Moduł importu BitsTransfer

Po załadowaniu modułu możesz wyświetlić listę wszystkich dostępnych poleceń modułu BitsTransfer:

get-command * -BITS *

Jak widać, dostępnych jest tylko 8 cmdletów:

  • Dodaj plik bitowy
  • Complete-BitsTransfer
  • Get-BitsTransfer
  • Remove-BitsTransfer
  • Resume-BitsTransfer
  • Set-BitsTransfer
  • Start-BitsTransfer
  • Suspend-BitsTransfer

Synchroniczne przesyłanie plików między komputerami za pomocą BITS

Polecenie cmdlet Start-BitsTransfer umożliwia pobieranie plików przez HTTP (s) (a także cmdlet Invoke-WebRequest) oraz z udostępnionych folderów sieciowych (przez SMB). Aby pobrać plik z określonego adresu URL za pomocą protokołu BITS i zapisać go w katalogu lokalnym C: \ Temp, użyj polecenia:

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

Wiadomość Jest to transfer plików korzystający z usługi inteligentnego transferu w tle (BITS) mówi, że rozpoczęło się pobieranie określonego pliku przez protokół BITS.

W tym przykładzie polecenie cmdlet pobiera plik synchronicznie. Pobieranie pliku przypomina zwykłą procedurę kopiowania za pomocą Eksploratora lub polecenia cmdlet PoSh. W takim przypadku pasek postępu jest wyświetlany na ekranie, pokazując stan pobierania. Po ponownym uruchomieniu komputera pobieranie nie zostanie wznowione (konieczne będzie ponowne pobranie całego pliku).

Używanie usługi BITS do asynchronicznego kopiowania dużych plików przez sieć

Proces pobierania plików przez BITS można również uruchomić w trybie asynchronicznym, w tym celu należy dodać parametr do powyższego polecenia -asynchroniczny. W tym trybie, jeśli coś się wydarzy podczas pobierania pliku (ponowne uruchomienie serwera, klienta, odłączenie kanału komunikacyjnego itp.), Zadanie będzie automatycznie kontynuowane po przywróceniu dostępności źródła, a pobieranie pliku będzie kontynuowane od momentu przerwania połączenia.

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

Jest ważne. Domyślnie Start-BitsTransfer działa z priorytetem Pierwszego planu (najwyższym możliwym). Zakłada się, że pobieranie pliku uruchomionego w tym trybie będzie konkurować z innymi procesami o przepustowość kanału. Aby tego uniknąć, musisz jawnie określić na przykład dowolny inny priorytet jako argument polecenia, -Priorytet niski:

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

W tle działa asynchroniczne zadanie BITS, a proces wykonywania polecenia wysyłania pliku nie jest wyświetlany. Status zadania BITS można uzyskać z konsoli PowerShell za pomocą polecenia Get-BitsTransfer:

Get-BitsTransfer | fl

Polecenie zwraca status transferu (w tym przypadku jasne jest, że transfer został zakończony - przeniesiony), informacje o liczbie przesłanych bajtów, całkowitym rozmiarze pliku, czasach utworzenia i zakończenia zadania BITS.

Możesz wyświetlić status wszystkich zadań BITS uruchomionych na komputerze w formie tabelarycznej:

Get-BitsTransfer | wybierz DisplayName, BytesTotal, BytesTransfers, JobState | Format-Table -AutoSize

W trybie transferu asynchronicznego w katalogu docelowym tworzony jest plik tymczasowy z rozszerzeniem TMP (domyślnie ukryty w eksploratorze). Aby przekonwertować go na oryginalny typ pliku (przechowywany na serwerze źródłowym), musisz uruchomić komendę Complete-BitsTransfer:

Get-BitsTransfer | Complete-BitsTransfer

Później zadanie pobierania BITS jest uważane za ukończone i znika z listy zadań..

Możesz przesłać plik lokalny do udostępnionego folderu sieciowego na zdalnym serwerze. Aby to zrobić, użyj następującego polecenia (dla wygody możesz określić nazwę zadania kopiowania):

Start-BitsTransfer -Source C: \ iso \ w101809.iso -Destination \\ ekt-fs1 \ iso -Asynchronous -DisplayName CopyISOtoEKT

Aby tymczasowo zawiesić zadanie BITS, wykonaj:

Get-BitsTransfer -Name CopyISOtoEKT | Suspend-BitsTransfer

Aby kontynuować zadanie, użyj polecenia cmdlet Resume-BitsTransfer:

Get-BitsTransfer -Name CopyISOtoEKT | Resume-BitsTransfer -Asynchronous

Możesz dodać dodatkowe pliki do zadania BITS za pomocą polecenia cmdlet Add-BitsFile:

Get-BitsTransfer -Name CopyISOtoEKT | Add-BitsFile -Source C: \ iso \ w10msu \ * -Destination \\ ekt-fs1 \ iso -Asynchronous

Aby usunąć wszystkie zadania pobierania BITS na komputerze (w tym te uruchomione przez innych użytkowników), uruchom polecenie:

Get-BitsTransfer -Allusers | Remove-BitsTransfer

Nie można anulować zadań BITS uruchomionych z poziomu Systemu (błąd 0x80070005 Nie można anulować zadania). Aby anulować to zadanie, musisz uruchomić komendę Remove-BitsTransfer z poziomu SYSTEM.

Jeśli serwer, na którym plik jest przechowywany, wymaga uwierzytelnienia użytkownika, możesz otworzyć okno, w którym potrzebujesz poświadczeń, aby uzyskać dostęp do zasobu:

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

Aby ułatwić śledzenie wyników zadania BITS, możesz użyć prostego skryptu, który monitoruje zadanie i wyświetla procent obciążenia na ekranie co kilka sekund. Pod koniec pobierania pliku skrypt automatycznie konwertuje plik TMP do oryginalnego formatu:

Moduł importu BitsTransfer
$ job = Start-BitsTransfer -Source _http: //10.2.2.148/erd65_32.iso -Destination c: \ temp -Asynchronous
while (($ job.JobState.ToString () -eq „Transfering”) -lub ($ job.JobState.ToString () -eq „Connecting”))

Write-host $ Job.JobState.ToString ()
$ Pro = ($ job.BytesTransfers / $ job.BytesTotal) * 100
Write-Host $ Pro „%”
Spać 3

Zadanie Complete-BitsTransfer -BitsJob $

Kopiowanie całej zawartości udziału sieciowego przez BITS

Jak już powiedzieliśmy, BITS nie potrzebuje do działania serwera WWW, co oznacza, że ​​możesz kopiować pliki bezpośrednio z innych komputerów z systemem Windows lub udostępnionych folderów sieciowych:

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

Polecenia cmdlet modułu BitsTransfer nie mogą rekurencyjnie kopiować wszystkich plików i folderów z określonego katalogu lub plików używanych przez inne programy. Aby skopiować wszystkie pliki z podkatalogami z określonego folderu sieciowego, użyj tej funkcji (możesz najpierw sprawdzić, czy katalog docelowy istnieje i go utworzyć):

Moduł importu BitsTransfer
$ Source = "\\ msk-rep01 \ os \"
$ Destination = "c: \ tmp \"
if (-Not (Test-Path $ Destination))

$ null = New-Item -Path $ Destination -ItemType Directory

$ folder = Get-ChildItem -Name -Path $ source -Directory -Recurse
$ job = Start-BitsTransfer -Source $ Source \ *. * -Destination $ Destination -asynchronous -Priorytet niski
while (($ job.JobState.ToString () -eq „Transfering”) -lub ($ job.JobState.ToString () -eq „Connecting”))

Spać 3

Zadanie Complete-BitsTransfer -BitsJob $
foreach ($ i w $ folderach)

$ istnieje = ścieżka testowa $ Miejsce docelowe \ $ i
if ($ istnieje -eq $ false) Nowy element $ Miejsce docelowe \ $ i -ItemType Directory
$ job = Start-BitsTransfer -Source $ Source \ $ i \ *. * -Destination $ Destination \ $ i -asynchronous -Priorytet niski
while (($ job.JobState.ToString () -eq „Transfering”) -lub ($ job.JobState.ToString () -eq „Connecting”))

Spać 3

Zadanie Complete-BitsTransfer -BitsJob $


Przesyłanie pliku na serwer HTTP za pomocą PowerShell i BITS

Za pomocą usługi BITS można nie tylko pobrać plik z serwera HTTP, ale także przesłać go na zdalny serwer internetowy. Aby to zrobić, serwer sieci Web IIS z zainstalowanym komponentem musi być zainstalowany po stronie odbiorcy Bity Serwer Rozszerzenie. W ustawieniach katalogu wirtualnego IIS w sekcji Bity Przesłane trzeba włączyć opcję Pozwól klienci do przesłane pliki„.

Jeśli korzystasz z anonimowej autoryzacji, musisz pozwolić anonimowym użytkownikom pisać do katalogu na poziomie NTFS. Jeśli pobieranie pliku jest wykonywane przez upoważnionych użytkowników, muszą oni uzyskać uprawnienia RW do folderu pobierania.

Aby przesłać plik na serwer HTTP przy użyciu protokołu BITS, uruchom polecenie:

Start-bity -source c: \ iso \ win2016.iso -destination http://10.10.1.200/MEDVImages/win2016.iso -Transfertype Upload

Należy pamiętać, że domyślnie IIS umożliwia przesyłanie plików do 30 MB. Aby umożliwić przesyłanie dużych plików, musisz zmienić wartość parametru maxAllowContentLength w pliku web.config.

Dlatego korzystanie z funkcji BITS jest doskonałą alternatywą dla tradycyjnego kopiowania plików przez sieć przy użyciu protokołu SMB. W przeciwieństwie do tego ostatniego, zadanie kopiowania plików BITS jest wykonywane pomimo odłączania i ponownego uruchamiania komputerów i nie ładuje kanału komunikacyjnego bez zakłócania działania innych aplikacji sieciowych i użytkowników. Protokół BITS może być najlepszym rozwiązaniem do przesyłania dużych plików obrazów ISO i plików maszyn wirtualnych (vmdk, vhdx) przez sieć WAN.