通常,在本地和全局网络中,使用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协议中存在许多漏洞);BITS收件人和服务器端不一定需要已部署的IIS服务器。因此,BITS是在慢速和不稳定的网络(卫星信道,GPRS连接等)上传输大文件的首选协议。
BITS:OS和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支持。
如何使用PowerShell通过BITS协议下载文件?假设您要下载存储在IIS HTTP服务器(http://10.1.1.18/erd65_32.iso)上的大型ISO文件。假定允许对该URL进行匿名访问(以后我们将考虑通过身份验证访问URL)。
首先,在PowerShell会话中导入BITS模块:
Import-Module BitsTransfer
导入模块后,所有可用命令的列表可以显示如下:
get-command *-BITS*
如您所见,有8个cmdlet可用:
添加位文件完整位传输获取位传输Remove-BitsTransfer恢复位传输设置位传输起始位传输挂起比特转移Add-BitsFileComplete-BitsTransferGet-BitsTransferRemove-BitsTransferResume-BitsTransferSet-BitsTransferStart-BitsTransferSuspend-BitsTransfer使用BITS在计算机之间同步文件传输在启动BitsTransfe [R cmdlet允许您下载的文件通过HTTP(S)(如调用-的WebRequest cmdlet的),以及从网络共享文件夹(通过SMB)。要使用BITS协议从指定的URL下载文件并将其保存到本地目录C:\ Temp,请使用以下命令:
Start-BitsTransfer –source http://10.1.1.18/erd65_32.iso -destination c:\temp
消息“ 这是使用后台智能传输服务(BITS)的文件传输”表示正在使用BITS下载指定的文件。
在这种情况下,该cmdlet已开始以同步模式下载ISO文件。下载类似于通过文件资源管理器或使用Copy-Item cmdlet复制文件的通常过程。屏幕上显示一个进度条,其中显示下载状态。如果重新启动计算机,下载将不会继续(您需要再次下载整个文件)。
在异步模式下使用BITS通过网络传输大文件BITS下载也可以以异步模式开始。为此,在上面显示的命令中添加–asynchronous参数。在这种模式下,如果发生某种情况(服务器或客户端重新启动,通信通道中断等),则在恢复源之后,BITS作业将自动恢复,并且从连接中断的那一刻起,文件下载将继续:
Start-BitsTransfer -source http://10.1.1.18/erd65_32.iso -destination c:\temp -asynchronous
重要的。默认情况下,Start-BitsTransfer以Foreground优先级(可能的最高优先级)运行。假定以这种模式开始的下载将与其他进程争夺信道带宽。为了避免这种情况,您必须显式设置其他优先级作为命令的参数,例如,-Priority low:
Start-BitsTransfer -source http://10.1.1.18/erd65_32.iso -destination c:\temp -asynchronous -Priority low
异步BITS任务在后台运行,并且文件下载过程未显示在屏幕上。可以使用Get-BitsTransfer命令从PowerShell控制台获取 BITS作业的状态:
Get-BitsTransfer | fl
该命令返回传输状态(在这种情况下,传输已结束:已传输),有关传输的字节数,总文件大小,文件创建时间和任务完成时间的信息。
您可以以表格形式查看计算机上运行的所有BITS任务的状态:
Get-BitsTransfer | select DisplayName, BytesTotal, BytesTransferred, JobState | Format-Table -AutoSize
使用异步传输模式时,将创建带有TMP扩展名的临时文件(默认情况下,它在Windows资源管理器中隐藏)。要将其转换为源文件(存储在源服务器上),请运行命令Complete-BitsTransfer:
Get-BitsTransfer | Complete-BitsTransfer
然后将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
您可以使用Add-BitsFile cmdlet将其他文件添加到BITS任务中:
Get-BitsTransfer -Name CopyISOtoMan | Add-BitsFile -Source C:\iso\w10msu\* -Destination \\manch-fs1\iso -Asynchronous
要删除计算机上的所有BITS下载任务(包括其他用户启动的任务),请运行以下命令:
Get-BitsTransfer -Allusers|Remove-BitsTransfer
您无法取消在系统帐户下运行的BITS作业(错误0x80070005“无法取消作业”)。要取消此类任务,您需要在SYSTEM下执行Remove-BitsTransfer命令。
如果存储文件的服务器需要用户身份验证,则以下命令将允许显示一个窗口来指定访问资源的凭据:
Start-BitsTransfer -source http://10.1.1.18/erd65_32.iso -destination c:\temp -asynchronous -Priority low -Authentication NTLM -Credential Get-Credential
为了使跟踪BITS任务的结果更容易,您可以使用一个简单的脚本,该脚本可以跟踪任务进度,并且每隔几秒钟在屏幕上显示下载百分比。下载结束后,脚本会自动将TMP文件转换为源格式:
Import-Module BitsTransfer
$bitsjob = Start-BitsTransfer -Source http://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不需要Web服务器,这意味着我们可以直接从其他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,您不仅可以从HTTP服务器下载文件,还可以将其上传到远程Web服务器。为此,必须在目标服务器上安装具有Bits Server Extension组件的IIS Web 服务器。在“ 位上传”部分的IIS虚拟目录的设置中,您需要启用“ 允许客户端上传文件 ”选项。
如果使用匿名身份验证,则必须允许匿名用户在NTFS权限级别上写入目录。如果文件上传是在授权用户下执行的,则他们需要向上传文件夹授予RW权限。
要使用BITS协议将文件上传到HTTP服务器,请运行以下命令:
Start-bits –source c:\iso\winsrv2016.iso -destination http://10.1.1.18/MEDVImages/winsrv2016.iso –Transfertype Upload
请注意,默认情况下,IIS允许您上传最大30 MB的文件。要允许上传大文件,您需要更改web.config文件中maxAllowContentLength参数中的值。
因此,使用BITS功能是使用SMB协议通过网络复制普通文件的绝佳选择。尽管连接中断或计算机重新启动,BITS文件传输任务仍然执行,并且在不干扰其他应用程序的情况下不会占用太多带宽。BITS协议可能是通过WAN网络传输大型ISO映像和虚拟机文件(vmdk,vhdx)的最佳解决方案。