Computer >> คอมพิวเตอร์ >  >> ระบบ >> Windows Server

การคัดลอกไฟล์ขนาดใหญ่บนเครือข่ายที่ไม่น่าเชื่อถือโดยใช้ BITS และ PowerShell

ตามกฎแล้ว ในเครือข่ายท้องถิ่นและทั่วโลก ไฟล์จะถูกถ่ายโอนระหว่างอุปกรณ์โดยใช้โปรโตคอล SMB, FTP หรือ HTTP ปัญหาของโปรโตคอลเหล่านี้คือปัญหาบางอย่างในการดาวน์โหลดไฟล์ขนาดใหญ่ต่อ ซึ่งอาจเลวร้ายยิ่งกว่าเดิมหากเครือข่ายช้าหรือไม่เสถียร นอกจากนี้ เมื่อคัดลอกไฟล์โดยใช้โปรโตคอลเหล่านี้ แบนด์วิดท์ที่มีอยู่ทั้งหมดระหว่างเซิร์ฟเวอร์และผู้รับจะถูกใช้ ซึ่งอาจส่งผลเสียต่อประสิทธิภาพเครือข่ายและการทำงานของแอปเครือข่ายอื่นๆ (ไม่สามารถกำหนดค่านโยบาย QoS ที่ถูกต้องในเครือข่ายได้เสมอไป อุปกรณ์). ในบทความนี้ เราจะพิจารณาวิธีใช้ โปรโตคอล BITS และ PowerShell เพื่อคัดลอกไฟล์ขนาดใหญ่บนเครือข่ายที่ช้าหรือไม่เสถียร

โปรโตคอล BITS

BITS (บริการถ่ายโอนเบื้องหลังอัจฉริยะ) เป็นบริการของ Windows ที่ใช้ในการถ่ายโอนไฟล์ระหว่างระบบ คุณสามารถดาวน์โหลดและอัปโหลดไฟล์โดยใช้โปรโตคอล BITS คอมพิวเตอร์จะใช้โปรโตคอลนี้เมื่อรับไฟล์จากเซิร์ฟเวอร์เมื่อทำการอัปเดต Windows อัตโนมัติ (รวมถึงกรณีเมื่อดาวน์โหลดการอัปเดตจากเซิร์ฟเวอร์ WSUS) เมื่อรับโปรแกรมจากจุดแจกจ่าย SCCM เป็นต้น

ข้อดีของโปรโตคอล BITS :

  • BITS เป็นโปรโตคอลอัจฉริยะที่สามารถควบคุมแบนด์วิดท์ที่ใช้ของช่องทางการสื่อสารและไม่ส่งผลต่อการทำงานของแอปและบริการเครือข่ายอื่นๆ BITS สามารถใช้เฉพาะแบนด์วิดท์ฟรี (ไม่ได้ถูกจัดสรร) และเปลี่ยนอัตราข้อมูลแบบไดนามิกระหว่างการถ่ายโอน (หากแอปพลิเคชันอื่นเพิ่มการใช้เครือข่าย ไคลเอ็นต์ BITS สามารถลดอัตราการถ่ายโอนข้อมูลผ่านเครือข่ายได้)
  • ดาวน์โหลดไฟล์สามารถดำเนินการในโหมดพื้นหลังที่โปร่งใสสำหรับผู้ใช้
  • งาน BITS ในโหมดดำเนินการต่อจะดำเนินต่อไปโดยอัตโนมัติแม้ว่าช่องทางการสื่อสารระหว่างคอมพิวเตอร์และไคลเอ็นต์จะใช้งานไม่ได้ หรือหลังจากรีบูตคอมพิวเตอร์แล้ว
  • คุณสามารถหยุดชั่วคราวหรือดาวน์โหลดต่อโดย BITS โดยไม่ทำให้ข้อมูลสูญหาย หมายเหตุ . ความสามารถในการคัดลอกไฟล์ต่อผ่านเครือข่ายยังมีอยู่ในยูทิลิตี้ robocopy.exe ซึ่งช่วยให้คุณดาวน์โหลดไฟล์ต่อได้หากการเชื่อมต่อขาดหาย
  • BITS ช่วยให้คุณจัดการลำดับความสำคัญของงานดาวน์โหลด
  • การถ่ายโอนไฟล์ระหว่างคอมพิวเตอร์เกิดขึ้นที่พอร์ต 80 (HTTP) หรือ 443 (HTTPS) ดังนั้นคุณจึงไม่ต้องเปิดพอร์ตเพิ่มเติมบนไฟร์วอลล์ ตัวอย่างเช่น พอร์ต 445 ซึ่งใช้เมื่อคัดลอกไฟล์ผ่านโปรโตคอล SMB (อย่าลืมว่ามีช่องโหว่มากมายในโปรโตคอล SMB 1.0 เวอร์ชันเก่า)
  • ไม่จำเป็นต้องใช้เซิร์ฟเวอร์ IIS ที่ปรับใช้กับผู้รับ BITS และฝั่งเซิร์ฟเวอร์

ดังนั้น BITS จึงเป็นโปรโตคอลที่เหมาะสำหรับการถ่ายโอนไฟล์ขนาดใหญ่ผ่านเครือข่ายที่ช้าและไม่เสถียร (ช่องสัญญาณดาวเทียม การเชื่อมต่อ GPRS เป็นต้น)

BITS:ข้อกำหนดเวอร์ชันของระบบปฏิบัติการและ PowerShell

โปรโตคอล BITS ปรากฏใน Windows XP ซึ่ง bitsadmin.exe ยูทิลิตี้สามารถใช้เพื่อจัดการงาน BITS ยูทิลิตียังคงได้รับการสนับสนุน แต่เลิกใช้แล้ว ในการจัดการงาน BITS ควรใช้ PowerShell cmdlet แบบพิเศษ

ในการทำงานภายใต้สถานการณ์นี้ คุณต้องมีระบบปฏิบัติการไม่ต่ำกว่า Windows Vista หรือ Windows Server 2008 และ PowerShell 2.0 หรือใหม่กว่า Windows 10 และ Windows Server 2016/2012 R2 เวอร์ชันใหม่รองรับ BITS อย่างสมบูรณ์

เคล็ดลับ . สามารถใช้ Windows Server 2003 ได้เช่นกัน ในกรณีนี้ คุณจะต้องติดตั้งการอัปเดต KB 923845 และ PowerShell 2.0

ต้องการการสนับสนุน BITS ที่ด้านข้างของไคลเอ็นต์และเซิร์ฟเวอร์

จะดาวน์โหลดไฟล์ผ่านโปรโตคอล BITS โดยใช้ PowerShell ได้อย่างไร

สมมติว่าคุณต้องการดาวน์โหลดไฟล์ ISO ขนาดใหญ่ที่จัดเก็บไว้ในเซิร์ฟเวอร์ IIS HTTP (https://10.1.1.18/erd65_32.iso ). สันนิษฐานว่าอนุญาตให้เข้าถึง URL นี้โดยไม่ระบุชื่อ (ภายหลังเราจะพิจารณาการเข้าถึง URL ด้วยการตรวจสอบสิทธิ์)

ก่อนอื่น นำเข้าโมดูล BITS ในเซสชัน PowerShell ของคุณ:

Import-Module BitsTransfer

หลังจากที่นำเข้าโมดูลแล้ว รายการคำสั่งที่มีอยู่ทั้งหมดสามารถแสดงได้ดังนี้:

get-command *-BITS*

การคัดลอกไฟล์ขนาดใหญ่บนเครือข่ายที่ไม่น่าเชื่อถือโดยใช้ BITS และ PowerShell

อย่างที่คุณเห็น มี 8 cmdlets ที่พร้อมใช้งาน:

  • Add-BitsFile
  • การโอนบิตที่สมบูรณ์
  • รับ BitsTransfer
  • Remove-BitsTransfer
  • ประวัติ-BitsTransfer
  • Set-BitsTransfer
  • เริ่ม-BitsTransfer
  • ระงับ-BitsTransfer

การถ่ายโอนไฟล์แบบซิงโครนัสระหว่างคอมพิวเตอร์โดยใช้ BITS

Start-BitsTransfe r cmdlet ให้คุณดาวน์โหลดไฟล์ผ่าน HTTP (เช่น Invoke-WebRequest cmdlet) รวมถึงจากโฟลเดอร์แชร์เครือข่าย (ผ่าน SMB) ในการดาวน์โหลดไฟล์จาก URL ที่ระบุโดยใช้โปรโตคอล BITS และบันทึกลงในไดเร็กทอรี C:\Temp ให้ใช้คำสั่ง:

Start-BitsTransfer –source https://10.1.1.18/erd65_32.iso -destination c:\temp
การคัดลอกไฟล์ขนาดใหญ่บนเครือข่ายที่ไม่น่าเชื่อถือโดยใช้ BITS และ PowerShell

ข้อความ “นี่คือการถ่ายโอนไฟล์ที่ใช้บริการ Background Intelligent Transfer (BITS)” หมายความว่ากำลังดาวน์โหลดไฟล์ที่ระบุโดยใช้ BITS

ในกรณีนี้ cmdlet ได้เริ่มดาวน์โหลดไฟล์ ISO ในโหมดซิงโครนัส การดาวน์โหลดนี้คล้ายกับกระบวนการปกติของการคัดลอกไฟล์ผ่าน File Explorer หรือใช้ Copy-Item cmdlet แถบความคืบหน้าจะปรากฏขึ้นบนหน้าจอ ซึ่งแสดงสถานะการดาวน์โหลด หากรีสตาร์ทคอมพิวเตอร์ การดาวน์โหลดจะไม่กลับมาทำงานต่อ (คุณจะต้องดาวน์โหลดไฟล์ทั้งหมดอีกครั้ง)

การถ่ายโอนไฟล์ขนาดใหญ่ผ่านเครือข่ายด้วย BITS ในโหมดอะซิงโครนัส

การดาวน์โหลด BITS สามารถเริ่มได้ในโหมดอะซิงโครนัสเช่นกัน หากต้องการดำเนินการ ให้เพิ่ม –asynchronous พารามิเตอร์ไปยังคำสั่งที่แสดงด้านบน ในโหมดนี้ ถ้ามีบางอย่างเกิดขึ้น (เซิร์ฟเวอร์หรือไคลเอนต์รีบูต การหยุดชะงักของช่องทางการสื่อสาร ฯลฯ) งาน BITS จะดำเนินต่อโดยอัตโนมัติหลังจากกู้คืนแหล่งที่มาและการดาวน์โหลดไฟล์จะดำเนินต่อไปตั้งแต่วินาทีที่การเชื่อมต่อถูกขัดจังหวะ:

Start-BitsTransfer -source https://10.1.1.18/erd65_32.iso -destination c:\temp -asynchronous

การคัดลอกไฟล์ขนาดใหญ่บนเครือข่ายที่ไม่น่าเชื่อถือโดยใช้ BITS และ PowerShell

สำคัญ . โดยค่าเริ่มต้น Start-BitsTransfer จะทำงานด้วยลำดับความสำคัญเบื้องหน้า (ระดับสูงสุดที่เป็นไปได้) คาดว่าการดาวน์โหลดที่เริ่มต้นในโหมดนี้จะแข่งขันกับกระบวนการอื่นๆ สำหรับแบนด์วิดท์ของช่อง เพื่อหลีกเลี่ยงปัญหานี้ คุณต้องตั้งค่าลำดับความสำคัญอื่นใดอย่างชัดเจนเป็นอาร์กิวเมนต์ของคำสั่ง e g., -ลำดับความสำคัญต่ำ:

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

งาน BITS แบบอะซิงโครนัสทำงานในพื้นหลัง และกระบวนการดาวน์โหลดไฟล์จะไม่แสดงบนหน้าจอ สามารถรับสถานะของงาน BITS ได้จากคอนโซล PowerShell โดยใช้ Get-BitsTransfer คำสั่ง:

Get-BitsTransfer | fl

การคัดลอกไฟล์ขนาดใหญ่บนเครือข่ายที่ไม่น่าเชื่อถือโดยใช้ BITS และ PowerShell

คำสั่งส่งกลับสถานะการถ่ายโอน (ในกรณีนี้ การถ่ายโอนสิ้นสุด:โอนแล้ว) ข้อมูลเกี่ยวกับจำนวนไบต์ที่โอน ขนาดไฟล์ทั้งหมด เวลาที่ไฟล์ถูกสร้างขึ้น และเวลาที่งานเสร็จสมบูรณ์

คุณสามารถดูสถานะของงาน BITS ทั้งหมดที่ทำงานบนคอมพิวเตอร์ในรูปแบบตาราง:

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

เมื่อใช้โหมดการถ่ายโอนแบบอะซิงโครนัส ไฟล์ชั่วคราวที่มี TMP ส่วนขยายถูกสร้างขึ้น (โดยค่าเริ่มต้น มันถูกซ่อนอยู่ใน Windows Explorer) หากต้องการแปลงเป็นไฟล์ต้นฉบับ (ซึ่งจัดเก็บอยู่บนเซิร์ฟเวอร์ต้นทาง) ให้เรียกใช้คำสั่ง Complete-BitsTransfer :

Get-BitsTransfer | Complete-BitsTransfer

การคัดลอกไฟล์ขนาดใหญ่บนเครือข่ายที่ไม่น่าเชื่อถือโดยใช้ BITS และ PowerShell

งานดาวน์โหลด BITS จะถือว่าเสร็จสมบูรณ์และถูกลบออกจากรายการงาน

คุณสามารถอัปโหลดไฟล์ในเครื่องไปยังโฟลเดอร์แชร์บนเครือข่ายบนเซิร์ฟเวอร์ไฟล์ Windows ระยะไกลได้ ในการดำเนินการนี้ ให้ใช้คำสั่งต่อไปนี้ (เพื่อความสะดวก คุณสามารถระบุชื่องานคัดลอกได้):

Start-BitsTransfer -Source C:\iso\w10_1809.iso -Destination \\manch-fs1\iso -Asynchronous -DisplayName CopyISOtoMan

หากต้องการระงับงาน BITS ชั่วคราว ให้เรียกใช้:

Get-BitsTransfer -Name CopyISOtoMan | Suspend-BitsTransfer

เมื่อต้องการทำงาน BITS ต่อ ให้ใช้ Resume-BitsTransfer cmdlet:

Get-BitsTransfer -Name CopyISOtoMan | Resume-BitsTransfer -Asynchronous

คุณสามารถเพิ่มไฟล์เพิ่มเติมในงาน BITS โดยใช้ Add-BitsFile cmdlet:

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

หากต้องการลบงานดาวน์โหลด BITS ทั้งหมดบนคอมพิวเตอร์ (รวมถึงงานที่ผู้ใช้รายอื่นเริ่มต้น) ให้เรียกใช้คำสั่งต่อไปนี้:

Get-BitsTransfer -Allusers|Remove-BitsTransfer

คุณไม่สามารถยกเลิกงาน BITS ที่ทำงานภายใต้บัญชีระบบ (ข้อผิดพลาด 0x80070005 "ไม่สามารถยกเลิกงาน") หากต้องการยกเลิกงานดังกล่าว คุณต้องดำเนินการคำสั่ง Remove-BitsTransfer ภายใต้ SYSTEM

หากเซิร์ฟเวอร์ที่จัดเก็บไฟล์ต้องมีการตรวจสอบสิทธิ์ผู้ใช้ คำสั่งต่อไปนี้จะอนุญาตให้แสดงหน้าต่างเพื่อระบุข้อมูลประจำตัวเพื่อเข้าถึงทรัพยากร:

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

การคัดลอกไฟล์ขนาดใหญ่บนเครือข่ายที่ไม่น่าเชื่อถือโดยใช้ BITS และ PowerShell

เพื่อให้ง่ายต่อการติดตามผลลัพธ์ของงาน BITS คุณสามารถใช้สคริปต์อย่างง่าย ซึ่งช่วยในการติดตามความคืบหน้าของงาน และทุกๆ สองสามวินาทีจะแสดงเปอร์เซ็นต์การดาวน์โหลดบนหน้าจอ หลังจากการดาวน์โหลดสิ้นสุดลง สคริปต์จะแปลงไฟล์ TMP เป็นรูปแบบต้นทางโดยอัตโนมัติ:

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

จะคัดลอกเนื้อหาไดเรกทอรีโดยใช้ BITS ได้อย่างไร

ดังที่เราได้กล่าวไปแล้ว BITS ไม่ต้องการเว็บเซิร์ฟเวอร์ และหมายความว่าเราสามารถคัดลอกไฟล์ได้โดยตรงจากคอมพิวเตอร์ Windows เครื่องอื่นหรือโฟลเดอร์ที่แชร์บนเครือข่าย:

Start-BitsTransfer -Source \\lon-rep01\os\RHEL4.8-x86_64-AS-DVD.iso -Destination c:\temp -Asynchronous

BitsTransfer ไม่สามารถคัดลอกไฟล์และโฟลเดอร์ทั้งหมดซ้ำๆ จากโฟลเดอร์เฉพาะหรือไฟล์ที่ใช้โดยโปรแกรมอื่น ในการคัดลอกไฟล์และไดเร็กทอรีย่อยทั้งหมดจากโฟลเดอร์แชร์บนเครือข่ายที่ระบุ ให้ใช้สคริปต์นี้ (คุณสามารถตรวจสอบก่อนว่าไดเร็กทอรีเป้าหมายมีอยู่และสร้างมันขึ้นมา):

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

การคัดลอกไฟล์ขนาดใหญ่บนเครือข่ายที่ไม่น่าเชื่อถือโดยใช้ BITS และ PowerShell

จะอัปโหลดไฟล์บนเซิร์ฟเวอร์ HTTP โดยใช้ PowerShell และ BITS ได้อย่างไร

ด้วย BITS คุณไม่เพียงแต่สามารถดาวน์โหลดไฟล์จากเซิร์ฟเวอร์ HTTP เท่านั้น แต่ยังอัปโหลดไปยังเว็บเซิร์ฟเวอร์ระยะไกลได้อีกด้วย ในการดำเนินการนี้ เว็บเซิร์ฟเวอร์ IIS ที่มี ส่วนขยายเซิร์ฟเวอร์บิต ต้องติดตั้งคอมโพเนนต์บนเซิร์ฟเวอร์เป้าหมาย ในการตั้งค่าไดเรกทอรีเสมือนของ IIS ใน การอัปโหลดบิต คุณต้องเปิดใช้งาน "อนุญาตให้ไคลเอ็นต์อัปโหลดไฟล์ ” ตัวเลือก

การคัดลอกไฟล์ขนาดใหญ่บนเครือข่ายที่ไม่น่าเชื่อถือโดยใช้ BITS และ PowerShell

หากคุณใช้การรับรองความถูกต้องแบบไม่ระบุชื่อ คุณต้องอนุญาตให้ผู้ใช้ที่ไม่ระบุชื่อเขียนไปยังไดเร็กทอรีในระดับสิทธิ์ NTFS หากการอัปโหลดไฟล์ดำเนินการภายใต้ผู้ใช้ที่ได้รับอนุญาต พวกเขาจะต้องให้สิทธิ์ RW ในโฟลเดอร์อัปโหลด

ในการอัปโหลดไฟล์ไปยังเซิร์ฟเวอร์ HTTP โดยใช้โปรโตคอล BITS ให้เรียกใช้คำสั่งต่อไปนี้:

Start-bits –source c:\iso\winsrv2016.iso -destination https://10.1.1.18/MEDVImages/winsrv2016.iso –Transfertype Upload

โปรดทราบว่าโดยค่าเริ่มต้น IIS อนุญาตให้คุณอัปโหลดไฟล์ได้สูงสุด 30 MB เพื่อให้สามารถอัปโหลดไฟล์ขนาดใหญ่ได้ คุณต้องเปลี่ยนค่าในพารามิเตอร์ maxAllowContentLength ในไฟล์ web.config

ดังนั้น การใช้คุณลักษณะ BITS จึงเป็นทางเลือกที่ดีในการคัดลอกไฟล์ทั่วไปผ่านเครือข่ายโดยใช้โปรโตคอล SMB งานถ่ายโอนไฟล์ BITS จะดำเนินการแม้จะมีการหยุดชะงักของการเชื่อมต่อหรือการรีสตาร์ทคอมพิวเตอร์ และไม่ใช้แบนด์วิดท์มากนักโดยไม่รบกวนแอปอื่นๆ โปรโตคอล BITS อาจเป็นโซลูชันที่เหมาะสมที่สุดสำหรับการถ่ายโอนอิมเมจ ISO ขนาดใหญ่และไฟล์เครื่องเสมือน (vmdk, vhdx) ผ่านเครือข่าย WAN