BITS:Background Intelligent Transfer Service,后台智能传输服务,bitsadmin.exe 是 BITS 服务的命令行管理工具,截图为 bitsadmin /? BITS 是 Windows 系统自带后台异步文件传输组件后台下载 / 上传 Windows 下命令行下载文件的方法;在 Windows 操作系统中通过命令行下载文件的各种方法与工具;
bitsadmin.exe 3.0 配套链(全枚举,分:单命令|双参数组合|多命令组合场景)
BITSADMIN 3.0,后台智能传输服务,支持断点续传、空闲带宽后台传输;任务生命周期链:创建任务 → 添加文件 → 设置属性(优先级 / 代理 / 证书 / 重试)→ 启动 → 监控状态 → 等待完成 → 提交 complete /cancel 取消。
一、单个基础命令(原子命令)
| 序号 | 命令 | 简要说明 |
|---|---|---|
| 1 | bitsadmin /? |
查看完整帮助文档 |
| 2 | bitsadmin /list |
列出当前用户所有 BITS 任务 |
| 3 | bitsadmin /list /allusers /verbose |
列出本机全部用户的任务,输出详细信息 |
| 4 | bitsadmin /monitor /allusers /refresh 3 |
实时监控所有用户任务,3 秒刷新一次 |
| 5 | bitsadmin /reset /allusers |
清空本机所有用户全部 BITS 任务 |
| 6 | bitsadmin /create /download mydl |
创建下载类型任务,任务名 mydl |
| 7 | bitsadmin /create /upload myup |
创建上传任务 |
| 8 | bitsadmin /create /upload-reply myupr |
创建上传 + 服务器应答任务 |
| 9 | bitsadmin /addfile mydl https://xxx/file.iso D:\file.iso |
向任务添加单个远程文件下载项 |
| 10 | bitsadmin /addfileset mydl D:\filelist.txt |
批量导入文件列表(文本清单)添加多个文件 |
| 11 | bitsadmin /addfilewithranges mydl https://xxx/file D:\localfile 0:2000,5000:eof |
分段字节范围下载,只获取文件部分区间 |
| 12 | bitsadmin /replaceremoteprefix mydl https://old.example https://new.example |
批量替换任务内 URL 前缀 |
| 13 | bitsadmin /listfiles mydl |
列出任务内所有待传输文件清单 |
| 14 | bitsadmin /suspend mydl |
暂停任务 |
| 15 | bitsadmin /resume mydl |
恢复 / 继续任务传输 |
| 16 | bitsadmin /cancel mydl |
取消任务,丢弃临时缓存 |
| 17 | bitsadmin /complete mydl |
任务传输完成,提交写入本地最终文件(必执行) |
| 18 | bitsadmin /info mydl /verbose |
查看任务完整详细信息 |
| 19 | bitsadmin /getstate mydl |
获取任务状态(Transferring / Transferred / Error 等) |
| 20 | bitsadmin /getbytestotal mydl |
获取任务总字节大小 |
| 21 | bitsadmin /getbytestransferred mydl |
获取已经传输字节数 |
| 22 | bitsadmin /getfilestotal mydl |
任务内文件总数 |
| 23 | bitsadmin /getfilestransferred mydl |
已完成传输的文件数量 |
| 24 | bitsadmin /geterror mydl |
获取任务详细错误信息 |
| 25 | bitsadmin /geterrormycount mydl |
获取任务错误重试次数 |
| 26 | bitsadmin /setpriority mydl HIGH |
设置任务优先级:FOREGROUND/HIGH/NORMAL/LOW |
| 27 | bitsadmin /setminretrydelay mydl 10 |
最小重试间隔 10 秒 |
| 28 | bitsadmin /setnoprogresstimeout mydl 300 |
无传输进度超时,300 秒 |
| 29 | bitsadmin /setmaxdownloadtime mydl 3600 |
任务最大下载总时长 3600 秒 |
| 30 | bitsadmin /setproxysettings mydl NO_PROXY |
不使用代理;可选 PRECONFIG/AUTODETECT/OVERRIDE |
| 31 | bitsadmin /setcustomheaders mydl "User-Agent: myagent" |
自定义 HTTP 请求头 |
| 32 | bitsadmin /sethttpmethod mydl GET |
指定 HTTP 请求方法 GET/POST |
| 33 | bitsadmin /setcredentials mydl SERVER BASIC user1 pwd123 |
添加服务器基础认证账号密码 |
| 34 | bitsadmin /removecredentials mydl SERVER BASIC |
移除服务器认证凭据 |
| 35 | bitsadmin /takeshipownership mydl |
获取任务所有权 |
| 36 | bitsadmin /setnotifycmdline mydl D:\notify.exe NULL |
任务完成后执行回调程序 |
| 37 | bitsadmin /transfer mydl /download https://xxx/file.zip D:\file.zip |
一键快捷传输(内部封装 create+addfile+resume+complete) |
二、双命令组合实例
| 序号 | 命令脚本 | 简要说明 |
|---|---|---|
| A | bitsadmin /create mydl && bitsadmin /addfile mydl https://example.iso D:\iso.iso |
创建任务 + 添加下载文件 |
| B | bitsadmin /resume mydl && bitsadmin /info mydl /verbose |
启动任务,立刻查看任务详情 |
| C | bitsadmin /getstate mydl && bitsadmin /getbytestransferred mydl |
查询任务状态 + 已下载字节 |
| D | bitsadmin /setpriority mydl LOW && bitsadmin /setminretrydelay mydl 15 |
设置低优先级 + 15 秒重试间隔 |
| E | bitsadmin /setproxysettings mydl NO_PROXY && bitsadmin /setcustomheaders mydl "Accept: */*" |
关闭代理 + 自定义 HTTP 头 |
| F | bitsadmin /list > D:\bits_tasklist.txt && bitsadmin /reset |
导出任务清单,然后清空全部任务 |
| G | bitsadmin /suspend mydl && bitsadmin /resume mydl |
暂停后恢复任务 |
三、三命令组合实例
| 序号 | 命令脚本 | 简要说明 |
|---|---|---|
| H | bitsadmin /create mydlbitsadmin /addfile mydl https://example.com/file.iso D:\iso.isobitsadmin /resume mydl |
完整创建任务、添加文件、启动后台下载 |
| I | bitsadmin /info mydl /verbosebitsadmin /getbytestransferred mydlbitsadmin /getstate mydl |
查看任务详情、已下载大小、当前任务状态 |
| J | bitsadmin /create mydlbitsadmin /setproxysettings mydl NO_PROXYbitsadmin /addfile mydl https://xxx D:\xxx |
创建任务,先关闭代理,再添加下载文件 |
四、多命令完整业务配套链(运维场景)
场景 1:后台下载大文件,阻塞等待传输完成,提交任务,校验文件 | 序号 | 命令脚本 | 简要说明 | | ---- | ---- | ---- |
|Chain1|
bitsadmin /create iso_dlbitsadmin /addfile iso_dl https://example.com/win.iso D:\win.isobitsadmin /resume iso_dlbitsadmin /wait iso_dlbitsadmin /complete iso_dlcertutil -hashfile D:\win.iso SHA256| 创建任务、添加 ISO、启动下载;阻塞等待传输结束;提交保存文件;哈希校验文件完整性 |
场景 2:批量文件清单下载,设置任务参数,监控进度,异常取消 | 序号 | 命令脚本 | 简要说明 | | ---- | ---- | ---- |
|Chain2|
bitsadmin /create batch_dlbitsadmin /setpriority batch_dl LOWbitsadmin /addfileset batch_dl D:\filelist.txtbitsadmin /resume batch_dlbitsadmin /monitor /refresh 2bitsadmin /cancel batch_dl| 创建批量任务,低优先级,加载外部文件清单;启动;实时监控;最后取消任务 |
场景 3:带认证、自定义请求头的 HTTPS 下载 | 序号 | 命令脚本 | 简要说明 | | ---- | ---- | ---- |
|Chain3|
bitsadmin /create auth_dlbitsadmin /setcredentials auth_dl SERVER BASIC admin 123456bitsadmin /setcustomheaders auth_dl "Accept: application/octet-stream"bitsadmin /addfile auth_dl https://example/file D:\file.binbitsadmin /resume auth_dlbitsadmin /wait auth_dlbitsadmin /complete auth_dl| 添加基础认证、自定义请求头,下载受保护资源 |
五、任务生命周期配套链逻辑
创建任务 /create → 设置任务属性(优先级/代理/凭据/HTTP头) → /addfile 添加文件
→ /resume 启动任务 → 循环查询 /getstate /getbytestransferred 监控进度
→ 成功:/wait → /complete 提交保存文件
→ 失败:/geterror 排查错误 → /cancel 清理任务
六、边界注意点
/complete是关键:不执行 complete,文件保留在 BITS 临时缓存,不会生成最终本地文件。- PE 环境:BITS 服务默认未启动,精简 PE 直接无法使用 bitsadmin。
- 任务名称支持中文,含空格必须用英文双引号包裹。
/transfer是快捷一次性命令,适合简单下载;复杂场景(自定义头、代理、认证)要用 create + addfile 分步链。
PS C:\WINDOWS\system32> bitsadmin.exe /?
BITSADMIN 版本 3.0
BITS 管理工具。
(C) 版权所有 Microsoft 公司
用法:BITSADMIN [/RAWRETURN] [/WRAP | /NOWRAP] 命令
可用命令如下:
/HELP 打印此帮助信息
/? 打印此帮助信息
/UTIL /? 打印工具类命令列表
/PEERCACHING /? 打印对等缓存管理命令列表
/CACHE /? 打印缓存管理命令列表
/PEERS /? 打印对等节点管理命令列表
/LIST [/ALLUSERS] [/VERBOSE] 列出传输任务
/MONITOR [/ALLUSERS] [/REFRESH 秒数] 监控复制管理器
/RESET [/ALLUSERS] 删除管理器内全部任务
/TRANSFER <任务名> [类型] [/PRIORITY 优先级] [/ACLFLAGS 标志] [/DYNAMIC]
远程URL 本地文件名
传输一个或多个文件。
[类型] 可选:/DOWNLOAD(下载)或 /UPLOAD(上传);默认是下载
可指定多组【URL/本地文件】配对。
和大多数命令不同:<任务名> 只能填写名称,不能使用GUID。
/DYNAMIC:为任务配置 BITS_JOB_PROPERTY_DYNAMIC_CONTENT,放宽服务器侧要求。
/CREATE [类型] <任务名> 创建任务
[类型] 可选:/DOWNLOAD、/UPLOAD、/UPLOAD-REPLY;默认下载和大多数命令不同:<任务名> 只能填写名称,不能使用GUID。
/INFO <任务> [/VERBOSE] 显示任务信息
/ADDFILE <任务> <远程URL> <本地文件名> 向任务添加单个文件
/ADDFILESET <任务> <文本文件> 向任务批量添加多个文件
文本文件内每行填写远程文件名和本地文件名,空格分隔。
以 # 开头的行视为注释。
读取文件列表到内存后,一次性添加到任务。
/ADDFILEWITHRANGES <任务> <远程URL> <本地文件名 范围列表>
类似 /ADDFILE,但BITS仅读取URL中指定字节区间。
range_list 使用逗号分隔多组【偏移量:长度】。
示例:
0:100,2000:100,5000:eof
含义:从偏移0读取100字节;偏移2000读取100字节;偏移5000读取直到文件末尾。
/REPLACEREMOTEPREFIX <任务> <旧前缀> <新前缀>
将所有以<旧前缀>开头的URL替换为<新前缀>
备注:BITS 当前支持 HTTP/HTTPS 的下载和上传。
URL 也支持 UNC 网络路径、file:// 本地文件路径。
/LISTFILES <任务> 列出任务内包含的文件
/SUSPEND <任务> 暂停任务
/RESUME <任务> 恢复/继续任务
/CANCEL <任务> 取消任务
/COMPLETE <任务> 完成任务(提交保存文件)
/GETTYPE <任务> 获取任务类型
/GETACLFLAGS <任务> 获取ACL继承标志
/SETACLFLAGS <任务> <ACL标志> 设置任务ACL继承标志
O - 所有者(OWNER) G - 组(GROUP)
D - 自主访问控制列表(DACL) S - 系统访问控制列表(SACL)
示例:
bitsadmin /setaclflags MyJob OGDS
bitsadmin /setaclflags MyJob OGD
/GETBYTESTOTAL <任务> 获取任务总文件大小
/GETBYTESTRANSFERRED <任务> 获取已传输字节数
/GETFILESTOTAL <任务> 获取任务内总文件数量
/GETFILESTRANSFERRED <任务> 获取已传输完成的文件数量
/GETCREATIONTIME <任务> 获取任务创建时间
/GETMODIFICATIONTIME <任务> 获取任务修改时间
/GETCOMPLETIONTIME <任务> 获取任务完成时间
/GETSTATE <任务> 获取任务状态
/GETERROR <任务> 获取详细错误信息
/GETOWNER <任务> 获取任务所有者
/GETDISPLAYNAME <任务> 获取任务显示名称
/SETDISPLAYNAME <任务> <显示名> 设置任务显示名称
/GETDESCRIPTION <任务> 获取任务描述
/SETDESCRIPTION <任务> <描述文本> 设置任务描述
/GETPRIORITY <任务> 获取任务优先级
/SETPRIORITY <任务> <优先级> 设置任务优先级
优先级可选值:
FOREGROUND(前台)
HIGH(高)
NORMAL(普通)
LOW(低)
/GETNOTIFYFLAGS <任务> 获取通知标志
/SETNOTIFYFLAGS <任务> <通知标志> 设置通知标志
此参数更多帮助,请查阅MSDN文档 SetNotifyFlags
/GETNOTIFYINTERFACE <任务> 判断通知接口是否已注册
/GETMINRETRYDELAY <任务> 获取重试间隔(单位:秒)
/SETMINRETRYDELAY <任务> <重试秒数> 设置最小重试延迟(秒)
/GETNOPROGRESSTIMEOUT <任务> 获取无进度超时时间(秒)
/SETNOPROGRESSTIMEOUT <任务> <超时秒> 设置无进度超时(秒)
/GETMAXDOWNLOADTIME <任务> 获取下载总超时(秒)
/SETMAXDOWNLOADTIME <任务> <超时秒> 设置下载最大超时(秒)
/GETERRORCOUNT <任务> 获取任务错误次数
/SETPROXYSETTINGS <任务> <使用方式> 设置代理配置
usage可选值:
PRECONFIG - 使用任务所有者默认Internet设置。
AUTODETECT - 自动检测代理。
NO_PROXY - 不使用代理服务器。
OVERRIDE - 使用自定义代理列表与例外列表。
后面必须跟代理列表、代理绕过列表。
空的绕过列表可以写 NULL 或 ""。
示例:
bitsadmin /setproxysettings MyJob PRECONFIG
bitsadmin /setproxysettings MyJob AUTODETECT
bitsadmin /setproxysettings MyJob NO_PROXY
bitsadmin /setproxysettings MyJob OVERRIDE proxy1:80 "<local>"
bitsadmin /setproxysettings MyJob OVERRIDE proxy1,proxy2,proxy3 NULL
/GETPROXYUSAGE <任务> 获取代理使用模式
/GETPROXYLIST <任务> 获取代理服务器列表
/GETPROXYBYPASSLIST <任务> 获取代理绕过地址列表
/TAKEOWNERSHIP <任务> 获取任务所有权
/SETNOTIFYCMDLINE <任务> <程序名> [程序参数]
设置任务完成后要执行的程序及可选参数。
程序名、参数都可以设置为NULL。
重要:如果参数不为NULL,程序名必须作为第一个参数。
示例:
bitsadmin /SetNotifyCmdLine MyJob c:\winnt\system32\notepad.exe NULL
bitsadmin /SetNotifyCmdLine MyJob c:\callback.exe "c:\callback.exe parm1 parm2"
bitsadmin /SetNotifyCmdLine MyJob NULL NULL
/GETNOTIFYCMDLINE <任务> 获取任务的通知命令行
/SETCREDENTIALS <任务> <目标> <认证方案> <用户名> <密码>
为任务添加身份凭证。
<目标> 可以是 SERVER(服务器)或 PROXY(代理)
<认证方案>:BASIC、DIGEST、NTLM、NEGOTIATE、PASSPORT。
/REMOVECREDENTIALS <任务> <目标> <认证方案>
从任务移除身份凭证。
/GETCUSTOMHEADERS <任务> 获取自定义HTTP请求头
/SETCUSTOMHEADERS <任务> <头1> <头2> <...> 设置自定义HTTP请求头
/MAKECUSTOMHEADERSWRITEONLY <任务> 将任务自定义HTTP头设为只读(不可撤销)
/GETHTTPMETHOD <任务> 获取使用的HTTP请求方法
/SETHTTPMETHOD <任务> <HTTPMethod> 设置HTTP请求方法
/GETCLIENTCERTIFICATE <任务> 获取任务客户端证书信息
/SETCLIENTCERTIFICATEBYID <任务> <存储位置> <存储名称> <十六进制证书ID>
为任务设置客户端身份认证证书。
<存储位置>取值:
1(CURRENT_USER 当前用户), 2(LOCAL_MACHINE 本地计算机), 3(CURRENT_SERVICE 当前服务),
4(SERVICES 服务), 5(USERS 用户), 6(CURRENT_USER_GROUP_POLICY 当前用户组策略),
7(LOCAL_MACHINE_GROUP_POLICY 本地计算机组策略) or 8(LOCAL_MACHINE_ENTERPRISE 本地计算机企业)。
/SETCLIENTCERTIFICATEBYNAME <任务> <存储位置> <存储名称> <主题名称>
按证书主题名称设置客户端认证证书。存储位置取值同上。
/REMOVECLIENTCERTIFICATE <任务> 删除任务客户端证书
/SETSECURITYFLAGS <任务> <数值>
设置传输过程中URL重定向、服务器证书校验相关HTTP安全标志。
值为无符号整数,二进制位定义:
启用CRL吊销检查 : 最低位置1
忽略服务器证书公用名称不匹配 : 右数第2位置1
忽略服务器证书过期时间错误 : 右数第3位置1
忽略服务器证书颁发机构无效 : 右数第4位置1
忽略证书用途不匹配 : 右数第5位置1
重定向策略 : 由右数第9~11位控制
0,0,0 - 自动允许重定向。
0,0,1 - 发生重定向时,更新IBackgroundCopyFile接口中的远程名称。
0,1,0 - 一旦出现重定向,任务直接失败。
允许HTTPS重定向到HTTP : 右数第12位置1
/GETSECURITYFLAGS <任务>
获取传输时URL重定向、服务器证书校验的HTTP安全标志。
/SETVALIDATIONSTATE <任务> <文件索引> <true|false>
<文件索引> 从0开始计数
设置任务内指定文件的内容验证状态。
/GETVALIDATIONSTATE <任务> <文件索引>
<文件索引> 从0开始计数
获取任务内指定文件的内容验证状态。
/GETTEMPORARYNAME <任务> <文件索引>
<文件索引> 从0开始计数
获取任务内指定文件的临时缓存文件名。
以下参数用于控制单个任务的对等缓存:
/SETPEERCACHINGFLAGS <任务> <数值>
设置任务对等缓存行为标志。
值为无符号整数,二进制位定义:
允许从此对等节点下载本任务数据 : 最低位置1
允许将本任务数据提供给其他对等节点 : 右数第2位置1
/GETPEERCACHINGFLAGS <任务>
获取任务对等缓存标志。
以下命令仅适用于 UPLOAD-REPLY(上传并接收应答)类型任务:
/GETREPLYFILENAME <任务> 获取存放服务器应答内容的文件路径
/SETREPLYFILENAME <任务> <路径> 设置存放服务器应答内容的文件路径
/GETREPLYPROGRESS <任务> 获取服务器应答文件大小与传输进度
/GETREPLYDATA <任务> 以十六进制导出服务器应答原始数据
/SETHELPERTOKEN <任务> 将当前命令提示符主令牌设为任务辅助令牌
/GETHELPERTOKENSID <任务> 获取任务辅助令牌对应的用户SID(如有)
/SETHELPERTOKENFLAGS <任务> <标志>
设置任务辅助令牌使用标志,可选值:
1 - 访问本地文件系统时使用辅助令牌。
2 - 访问网络资源时使用辅助令牌。
3 - 访问本地文件系统和网络都使用辅助令牌。
/GETHELPERTOKENFLAGS <任务>
获取任务辅助令牌使用标志。
/GETPEERSTATS <任务> <文件索引>
<文件索引> 从0开始计数
获取任务内指定文件:从对等节点、源服务器下载的数据量统计。
可放在命令前面的全局选项:
/RAWRETURN 返回便于程序解析的原始数据
/WRAP 控制台自动换行输出(默认)
/NOWRAP 控制台输出不自动换行
/RAWRETURN 会移除换行与格式化。
/CREATE 和所有 /GET* 命令支持该参数。
带 <任务> 参数的命令,既可以填写任务名称,也可以填写大括号包裹的任务GUID。
如果任务名称存在重名歧义,BITSADMIN 将返回报错。
bitsadmin.exe (BITSADMIN) 完整解构拆解
分析框架:底层原理|依赖文件|依赖关系|配套链|逻辑链路|边界 BITS:Background Intelligent Transfer Service,后台智能传输服务,
bitsadmin.exe是 BITS 服务的命令行管理工具,截图为bitsadmin /?完整帮助输出。
一、底层原理
BITS 是 Windows 系统自带后台异步文件传输组件,专门用于后台下载 / 上传,区别于 wget/curl 同步立即传输。
- 核心特性:带宽节流、感知网络状态、断点续传、后台优先级、会话持久化。
- 传输作业 (job) 存储在系统 BITS 数据库,脱离 bitsadmin.exe 进程独立运行;bitsadmin.exe 仅仅是命令行控制客户端,真正的传输工作由系统服务完成。
- 传输协议:支持 HTTP/HTTPS、SMB UNC 共享路径;支持下载 DOWNLOAD、上传 UPLOAD、上传‑应答 UPLOAD‑REPLY 三类 Job 类型。
- 带宽策略:自动避让前台应用带宽,空闲时跑满,前台程序占用带宽自动降速。
- 持久化:Job 写入 BITS 内部数据库,重启电脑依然保留任务,不会随命令行窗口关闭消失。
二、依赖文件
| 组件 | 文件路径 | 角色 |
|---|---|---|
| bitsadmin.exe | C:\Windows\System32\bitsadmin.exe |
命令行 CLI 工具,仅做指令下发,不执行实际网络 IO |
| Qmgr.dll | C:\Windows\System32\qmgr.dll |
BITS 核心 COM 组件,BITS 服务宿主逻辑 |
| Qmgrprxy.dll | C:\Windows\System32\qmgrprxy.dll |
BITS 代理 / 远程调用代理 COM |
| qmgr.exe | BITS 服务进程,服务名:Background Intelligent Transfer Service (BITS) | 系统服务可执行,真正执行下载上传 IO、网络、断点续传 |
| BITS 数据库存储 | %ProgramData%\Microsoft\Network\Downloader\qmgr*.dat |
BITS Job 持久化数据库,保存所有任务、分片、断点状态 |
| winhttp.dll | 系统 WinHTTP 栈 | BITS 底层 HTTP 网络栈;不使用 WinInet |
| advapi32.dll、secur32.dll | 系统安全组件 | 身份凭据、代理、认证 (Negotiate、NTLM、Basic、Digest) |
三、依赖关系
- 系统服务依赖
- 服务名称:
BITS(Background Intelligent Transfer Service),启动类型默认:手动 (延迟启动) - BITS 依赖组件:COM+ 事件系统、RPC 远程过程调用;依赖 WinHTTP 网络栈。
⚠️关键点:
bitsadmin.exe只是前端 CLI;如果 BITS 服务停止,bitsadmin 所有指令会报错,无法创建 / 操作 Job。 - 服务名称:
- 权限依赖
- 普通用户:可以创建属于自己用户上下文的 BITS Job;只能管理自己名下任务。
- 管理员:可以枚举、操作全部用户的 BITS 作业(
/ALLUSERS参数)。 - 服务会话 (系统账户) BITS 任务,普通用户无法查看。
- 网络依赖
- HTTP 传输走 WinHTTP,复用系统代理配置(Internet 选项代理);支持配置 Job 独立代理 (
/SETPROXYSETTINGS)。
- HTTP 传输走 WinHTTP,复用系统代理配置(Internet 选项代理);支持配置 Job 独立代理 (
- COM 接口 bitsadmin.exe 内部调用 IBackgroundCopyManager、IBackgroundCopyJob 等 BITS COM 接口,不是直接读写 qmgr.dat 数据库。
四、配套链
- 管理工具链
- bitsadmin.exe:命令行 CLI(截图中的全部命令)
- PowerShell BITS 模块:
Start‑BitsTransfer、Get‑BitsJob,底层同样调用 BITS COM 接口,是 bitsadmin 的 PowerShell 封装。 - 组策略:BITS 相关组策略,控制带宽节流、最大任务数量、代理行为、超时参数。
- 上层业务使用者
- Windows Update:底层大量使用 BITS 下载更新包
- Microsoft Store 应用更新
- SCCM/MDM 企业终端管理
- 部分安装程序、恶意软件也会滥用 BITS 做后台静默下载
- 配套配置项
- Job 属性:优先级 (FOREGROUND/HIGH/NORMAL/LOW)、超时、重试延迟、通知命令行 (
/SETNOTIFYCMDLINE),任务完成后可自动执行程序。 - ACL 标志:
/SETACLFLAGS控制下载完成文件继承的权限。 - 凭据管理:
/SETCREDENTIALS给 Job 附加服务器 / 代理认证账号密码。 - 对等缓存 Peercaching:Windows 10+ BITS 支持对等缓存 (P2P 分发,截图中
/PEERCACHING系列命令)。
- Job 属性:优先级 (FOREGROUND/HIGH/NORMAL/LOW)、超时、重试延迟、通知命令行 (
五、完整逻辑链路(时序)
- 用户执行
bitsadmin /create myjob - bitsadmin.exe 进程启动,加载 qmgrprxy.dll,RPC 调用 BITS 服务 (qmgr.exe) 的 COM 接口
IBackgroundCopyManager::CreateJob - BITS 服务在内部数据库 qmgr*.dat 创建 Job 元数据;返回 Job GUID。此时没有发生任何网络传输。
- 用户执行
bitsadmin /addfile添加远程 URL 和本地输出路径。CLI 通过 COM 接口把 URL、本地路径写入 Job 对象。 bitsadmin /resume myjob恢复任务,BITS 服务内部调度器接管任务:- 使用 WinHTTP 发起 HTTP 请求;分片下载;记录断点偏移到 qmgr*.dat 数据库。
- 自动检测网络断开、休眠、挂起,网络恢复自动续传。
- 根据系统前台负载动态调节带宽。
- 任务全部分片下载完成:进入 TRANSFERRED 状态;需要手动执行
bitsadmin /complete完成 Job,才会把临时文件重命名为最终目标文件。重要:不执行 complete,文件仍然是临时后缀,无法正常使用!
- 如果配置
SETNOTIFYCMDLINE,Job 完成后 BITS 服务进程会触发执行指定外部程序。 bitsadmin /list /allusers通过 COM 枚举数据库中全部 Job 信息展示到控制台。- 关闭 bitsadmin.exe 进程,BITS 服务继续后台跑任务,进程退出不影响下载。
典型完整示例
bitsadmin /create mydownload
bitsadmin /addfile mydownload https://xxx/file.exe D:\test\file.exe
bitsadmin /resume mydownload
::等待完成
bitsadmin /complete mydownload
六、边界、限制、坑点
- 进程生命周期边界 bitsadmin.exe 只是控制器;关闭 CMD/PowerShell 窗口,Job 还在 BITS 服务内继续跑。反之:停止 BITS 服务,所有任务暂停,重启服务会自动恢复。
- 必须 complete 才生成正式文件 传输状态 TRANSFERRED 只是分片全部拉取完毕;没有 complete,输出目录只有 BITS 临时文件,不会生成目标文件名。很多使用者踩坑。
- 身份会话边界
- 交互式用户创建 Job:在该用户登录会话运行;用户注销后 BITS 会暂停该用户任务。
- 系统账户 (LocalSystem) 创建 Job,注销不受影响。
- 普通用户默认只能看到自己的 Job,需要管理员加
/ALLUSERS查看全部用户任务。
- 协议边界 ✅支持 HTTP / HTTPS;✅SMB UNC 路径; ❌不支持 FTP;❌不支持自定义 TCP 协议;HTTP 底层使用 WinHTTP,不是 curl/wininet。
- 代理边界 每个 BITS Job 可以独立代理配置,会覆盖系统全局代理;BITS 对 SOCKS 代理支持很差,仅支持 HTTP 代理。
- 上传模式限制
UPLOAD:只能本地上传至 HTTP 服务器;UPLOAD‑REPLY上传后接收服务器返回内容;BITS 上传不支持 SMB 上传,上传只能走 HTTP。 - P2P 对等缓存 Peercaching Windows10/11 新增;需要组策略开启;企业分发场景使用;家庭版默认关闭。
- 安全边界
- BITS Job 可以设置
NotifyCmdLine,任务完成自动执行任意程序;该特性经常被恶意程序滥用做持久化、下载载荷。 - 凭据
SetCredentials存储于 BITS 作业内部,存在凭据泄露风险。 - BITS 任务数据库 qmgr*.dat 包含 URL、本地路径、作业元数据,可用于取证分析。
- 超时重试边界 可配置
SETNOPROGRESSTIMEOUT、SETRETRYDELAY;网络失败自动重试,不是立刻报错。 - 32/64 位 WOW64 重定向边界 在 32 位进程调用 bitsadmin,会被 WOW64 重定向;操作的 Job 仍然是系统全局 BITS 任务,不受 WOW64 隔离。
补充:bitsadmin vs Start‑BitsTransfer (PowerShell)
- bitsadmin.exe:老旧兼容 CLI 工具;脚本批处理 (.bat) 常用。
- Start‑BitsTransfer:PowerShell 封装,底层调用完全同一套 BITS COM;功能等价,更适合 ps1 脚本。
两者全部依赖 BITS 系统服务,没有独立实现传输逻辑。
在 Windows 操作系统中通过命令行下载文件的各种方法与工具。以下从逻辑结构、技术深度、实用价值和潜在改进点四个维度进行分析:
一、逻辑结构分析(组织合理性)
✅ 优点:层次清晰,由简到繁
文档采用“原生工具 → 第三方工具 → 高级技巧 → 自动化扩展”的递进逻辑:
- 优先使用系统内置能力(PowerShell、bitsadmin、certutil)——无需安装,安全可靠;
- 引入经典 Unix 工具(curl/wget)——满足习惯 Linux 的用户;
- 拓展现代高效工具(aria2、yt-dlp)——支持多线程、断点续传;
- 延伸至自动化与运维场景(任务计划、校验、解压、备份)——贴近真实工作流。
这种结构符合用户认知路径:“先用现成的,再装更好的,最后自动化”。
⚠️ 可优化点:分类略有重叠
- 例如
Invoke-WebRequest与WebClient、HttpClient在 PowerShell 章节重复出现; bitsadmin与Start-BitsTransfer本质同源(BITS 服务),可合并说明。
建议按 “工具类型”而非“命令形式” 重新归类(如:PowerShell 原生命令、Windows 内置 CLI 工具、第三方下载器)。
二、技术深度分析(准确性 & 全面性)
✅ 覆盖全面,细节丰富
- 工具覆盖面广:从
certutil(证书工具“跨界”下载)到aria2(多协议并发下载),甚至包含http(Windows 10 新增实验性工具); - 参数解释到位:如
bitsadmin /transfer各选项含义、aria2c -x/-s并发机制; - 场景考虑周全:认证下载、重定向处理、大文件续传、哈希校验、FTP/SFTP、代理设置等均有涉及。
✅ 强调安全与可靠性
- 提醒
wget/curl命令行暴露密码的风险; - 推荐使用
Get-FileHash校验完整性; - 指出
bitsadmin已被标记为过时(但可用)。
⚠️ 个别技术细节可更新
| 内容 | 建议修正/补充 |
|---|---|
“Windows 10 提供 http 命令行工具” |
实际应为 winget 或误记;Windows 并未内置名为 http 的官方下载工具(可能混淆了第三方工具如 HTTPie)。 |
certutil -urlcache 行为 |
该命令会缓存文件到系统目录(如 %USERPROFILE%\AppData\LocalLow\Microsoft\CryptnetUrlCache),并非直接保存到指定路径,可能造成误解。 |
| WSL 部分 | 可补充 WSL2 与 Windows 文件系统互操作性能差异(建议下载到 /mnt/c/ 而非 Linux 子系统内以避免 I/O 瓶颈)。 |
三、实用价值评估
✅ 极强的实战指导意义
- 对无图形界面环境(如 Server Core、远程桌面受限)的运维人员极为有用;
- 提供多种备选方案:当一种工具被禁用(如 PowerShell 被策略限制),仍有
certutil、bitsadmin等“逃生通道”; - 包含批量下载、定时任务、自动解压等脚本范例,可直接用于生产环境。
✅ 兼顾初学者与高级用户
- 初学者:复制粘贴
Invoke-WebRequest即可下载; - 高级用户:利用
aria2多线程、BITS后台低优先级传输优化带宽。
四、潜在改进方向
-
增加对比
将各工具按 速度、功能、安全性、是否需安装、是否支持断点续传 等维度横向对比,便于快速选型。 -
标注适用 Windows 版本
例如:curl:Windows 10 17064+ 内置;Start-BitsTransfer:需 PowerShell 2.0+(Win7 SP1 起);certutil:所有现代 Windows 均有。
-
补充错误处理示例
如 PowerShell 中try/catch捕获下载失败,或aria2c的退出码判断。 -
安全最佳实践强化
- 避免在命令行明文写密码(建议用
SecureString或凭证管理器); - 下载后验证数字签名(而不仅是哈希)。
- 避免在命令行明文写密码(建议用
总结
一份高质量、高实用性的技术备忘录,逻辑主线清晰,技术覆盖全面,尤其适合系统管理员、DevOps 工程师和渗透测试人员(后者常利用
certutil/bitsadmin绕过白名单)。
定位:不是理论教程,而是 “开箱即用”的命令行下载工具箱。
推荐使用方式:作为本地参考手册,在需要时快速查找对应场景的命令模板。
在 Windows 操作系统中,默认情况下并没有内置 curl 或 wget 命令行工具,但你仍然可以通过其他方法使用命令行下载文件。以下是一些可行的替代方案:
1. 使用 PowerShell 下载文件
Windows 提供了 PowerShell,它内置了一个非常强大的 Invoke-WebRequest 命令,可以用来下载文件。下面是如何通过 PowerShell 使用该命令下载文件。
打开 命令提示符(CMD) 或 PowerShell,输入以下命令:
powershell -Command "Invoke-WebRequest -Uri 'http://example.com/file.zip' -OutFile 'C:\path\to\save\file.zip'"
其中:
'http://example.com/file.zip'是你要下载的文件 URL。'C:\path\to\save\file.zip'是你希望保存文件的路径。
2. 使用 bitsadmin 下载文件
bitsadmin 是一个内置的命令行工具,虽然在新版 Windows 中它被标记为过时,但在大多数 Windows 版本中仍然可用。bitsadmin 可以用于后台下载文件。
下面是一个示例命令:
bitsadmin /transfer myDownloadJob /download /priority high http://example.com/file.zip C:\path\to\save\file.zip
其中:
/transfer myDownloadJob创建一个传输作业。/download表示下载操作。/priority high设置下载优先级。http://example.com/file.zip是文件的 URL。C:\path\to\save\file.zip是保存文件的路径。
请注意,bitsadmin 在较新的 Windows 版本中可能已经被弃用,但它仍然能在许多旧版本的 Windows 中使用。

bitsadmin 工具完整解析(基于截图帮助文档)
一、基础概述
1. 全称与定位
C:\Windows\System32\bitsadmin.exe。
2. 核心特性(区别 curl/Invoke-WebRequest)
- 断点续传:网络中断、重启系统后自动恢复传输;
- 后台低带宽:不抢占业务流量,空闲时传输;
- 持久化任务:任务保存在 BITS 服务,可设置完成后执行程序(后门常用);
- 支持代理、自定义 HTTP 头、客户端证书、ACL 权限隔离;
- 支持上传 / 下载,可配置通知脚本,任务完成自动运行指定 exe。
二、全局前置参数(截图顶部 /RAWRETURN/WRAP /NOWRAP)
| 参数 | 作用 | 适用场景 |
|---|---|---|
/RAWRETURN |
去除换行、格式化输出,原始结构化数据,便于脚本解析 | 批量自动化、EDR 日志采集 |
/WRAP |
控制台自动换行输出(默认开启) | 人工查看任务详情 |
/NOWRAP |
禁止自动换行,长 URL / 路径单行展示 | 批量导出任务 URL |
规则:全局参数必须写在子命令(create/transfer 等)最前面,如bitsadmin /RAWRETURN /LIST。
三、核心命令分类拆解(按截图帮助文档分组)
1. 基础辅助类
/HELP /?:打印完整帮助文档(截图当前执行的命令)/UTIL /?:打印 BITS 配套工具集说明/PEERCACHING /?:对等缓存(P2P 内网分发文件)命令集/PEERS /?:对等节点管理命令
2. 任务生命周期管理(最常用)
- /LIST [/ALLUSERS] [/VERBOSE]
枚举本机所有 BITS 传输任务;
/ALLUSERS查看全用户任务(含其他用户 / 系统后台任务),渗透时可发现管理员遗留下载、后门任务。 - /MONITOR [/REFRESH sec]
实时监控任务进度,按秒刷新。
- /RESET [/ALLUSERS]
清空本机全部 BITS 任务,清理渗透痕迹。
- /CREATE <JobName> [DOWNLOAD/UPLOAD/UPLOAD-REPLY]
创建传输任务,默认下载;仅支持任务名,不可直接填 GUID。
- /TRANSFER <job> [type] [/PRIORITY] 远程 URL 本地路径
一键创建 + 添加文件 + 启动任务,简化操作,渗透快速下载恶意程序。
- /ADDFILE <job> 远程 URL 本地文件
向已有任务添加单文件;支持多 URL 批量添加。
- /ADDSET <job> 文本文件
文本内批量写入「远程地址 本地路径」,批量添加传输文件。
- /SUSPEND /RESUME /CANCEL /COMPLETE <job>
暂停、恢复、取消、完成任务;/COMPLETE 必须执行才会落地本地文件,任务完成后可触发通知脚本。
3. 任务信息查询类(GET 系列)
/INFO <job>:完整打印任务 URL、本地路径、大小、进度、创建时间、代理配置/GETBYTESTOTAL /GETBYTESTRANSFERRED:文件总大小、已传输字节/GETFILESTOTAL /GETFILESTRANSFERRED:总文件数、已完成文件数/GETCREATIONTIME /GETMODIFICATIONTIME /GETCOMPLETIONTIME:任务时间戳,取证关键/GETPRIORITY /GETOWNER /GETDISPLAYNAME /GETDESCRIPTION:优先级、创建用户、任务展示名、描述/GETPROXYUSAGE /GETPROXYLIST /GETPROXYBYPASSLIST:读取代理配置,内网漫游、绕过防火墙常用
4. 任务配置修改类(SET 系列,后门核心)
- /SETNOTIFYCMD <job> 程序 [参数]
【高危渗透功能】任务传输完成后自动执行指定程序,可写入后门、反弹 Shell、读取 wbem/WMI 仓库文件。示例:
bitsadmin /setnotifycmd backdoor C:\windows\system32\cmd.exe "/c whoami" - /SETPRIORITY <job> PRIORITY`(FOREGROUND/HIGH/NORMAL/LOW)
设置传输优先级,后台隐蔽传输用 LOW。
- /SETPROXYSETTINGS <job> PRECONFIG/AUTODETECT/NO_PROXY/OVERRIDE
自定义代理,OVERRIDE 可指定代理 IP 与白名单。
- /SETCREDENTIALS <job> TARGET SCHEME USER PWD
为 HTTP 目标附加基础认证凭据,批量爬内网 Web 管理面板(phpMyAdmin/WMI 5985)。
- /SETCUSTOMHEADERS /SETHttpMethod
自定义 HTTP 请求头、请求方法(GET/POST),可构造 SSRF 请求对内网端口扫描。
- /SETSECURITYFLAGS <job> value
控制 HTTPS 证书校验、302 重定向放行规则:
- 可配置允许自动跟随跳转、忽略证书错误,用于 SSRF 链式 302 隐形重定向利用;
- 位掩码控制:是否允许 HTTP→HTTPS 跳转、是否校验证书域名。
- /TAKEOWNERSHIP <job>
夺取其他用户创建任务的控制权,横向移动接管管理员 BITS 任务。
5. 对等缓存(PeerCaching)内网 P2P 分发
/SETPEERCACHINGFLAGS 开启 / 关闭从内网对等节点下载文件,企业多终端批量分发工具、恶意载荷。6. 上传专属参数(UPLOAD-REPLY 任务)
/GETREPLYFILENAME /SETREPLYFILENAME:读取 / 设置上传后服务器返回文件,用于内网数据外带,上传本地 wbem/evtx 日志到公网服务器。四、底层工作原理
- 服务载体
BITS 运行在独立 svchost 进程(
svchost.exe -k bits),所有 bitsadmin 命令通过 RPC 调用 BITS 服务,任务持久化存储在系统注册表,重启不丢失。 - 传输底层逻辑
- HTTP/HTTPS:基于 WinHTTP 网络栈,支持 301/302 自动跳转(可通过
/SETSECURITYFLAGS控制隐形重定向); - UNC 路径:内网 SMB 共享文件传输;
- 内置带宽节流,仅系统空闲时分片传输,断点记录保存在系统目录。
- HTTP/HTTPS:基于 WinHTTP 网络栈,支持 301/302 自动跳转(可通过
- 持久化后门底层逻辑
创建下载任务 → 配置
/SETNOTIFYCMD执行恶意脚本 → 暂停任务,等待管理员登录 / 网络连通自动恢复传输 → 文件下载完成后自动执行后门,无弹窗隐蔽运行。 - 与隐形 / 隐藏重定向联动
bitsadmin 发起 HTTP 请求时,会跟随 WinHTTP 底层 302 隐形重定向,可配合 SSRF 漏洞访问内网 WMI、Redis、数据库端口;同时支持读取
C:\Windows\System32\wbem本地系统文件外带出网。
五、安全攻防关键场景
攻击侧利用
- 内网文件外带:下载本地 evtx 日志、WMI 仓库、数据库配置上传至公网 C2;
- SSRF 辅助利用:自定义 HTTP 头、允许跳转,构造多层 302 隐形重定向扫描内网端口;
- 无文件持久化:BITS 后台任务 + notifycmd,无需写入启动项,EDR 传统启动项排查难以发现;
- 横向移动:夺取管理员 BITS 任务,利用域代理访问域控共享、Web 服务。
防御侧检测(结合 wevtutil)
- 使用
wevtutil qe Microsoft-Windows-Bits-Client/Operational导出 BITS 操作日志; - 监控异常
/SETNOTIFYCMD配置、未知 URL 下载任务、低优先级后台批量传输; - 组策略限制普通用户修改 BITS 通知命令、禁用对等缓存;
- Windows 企业版 Defender for Endpoint 监控 bitsadmin 创建任务、执行 notifycmd 行为告警。
六、截图关键示例摘录
# 设置ACL权限
bitsadmin /setaclflags MyJob OGD
# 自定义代理(多代理+空旁路列表)
bitsadmin /setproxysettings MyJob OVERRIDE proxy1 proxy2 proxy3 NULL
# 任务完成执行记事本
bitsadmin /setnotifycmd MyJob c:\winnt\system32\notepad.exe NULL
# 带参数执行回调程序
bitsadmin /setnotifycmd MyJob c:\callback.exe "callback.exe parm1 parm2"
|
BITSADMIN version 3.0 USAGE: BITSADMIN [/RAWRETURN] [/WRAP | /NOWRAP] command /HELP Prints this help /LIST [/ALLUSERS] [/VERBOSE] List the jobs /TRANSFER <job name> [type] [/PRIORITY priority] [/ACLFLAGS flags] [/DYNAMIC] /CREATE [type] <job name> Creates a job /INFO <job> [/VERBOSE] Displays information about the job /ADDFILEWITHRANGES <job> <remote_url> <local_name range_list> 0:100,2000:100,5000:eof instructs BITS to read 100 bytes starting at offset zero, 100 bytes starting /REPLACEREMOTEPREFIX <job> <old_prefix> <new_prefix> Note that BITS currently supports HTTP/HTTPS downloads and uploads. /LISTFILES <job> Lists the files in the job /GETTYPE <job> Retrieves the job type /SETACLFLAGS <job> <ACL_flags> Sets the ACL propagation flags for the job Examples: /GETBYTESTOTAL <job> Retrieves the size of the job /SETPROXYSETTINGS <job> <usage> Sets the proxy usage /GETPROXYUSAGE <job> Retrieves the proxy usage setting /TAKEOWNERSHIP <job> Take ownership of the job /SETNOTIFYCMDLINE <job> <program_name> [program_parameters] Examples: /GETNOTIFYCMDLINE <job> Returns the job's notification command line /SETCREDENTIALS <job> <target> <scheme> <username> <password> /REMOVECREDENTIALS <job> <target> <scheme> /GETHTTPMETHOD <job> Gets the HTTP verb to use. /GETCLIENTCERTIFICATE <job> Gets the job's Client Certificate Information /SETCLIENTCERTIFICATEBYNAME <job> <store_location> <store_name> <subject_name> /REMOVECLIENTCERTIFICATE <job> Removes the Client Certificate Information from the job /SETSECURITYFLAGS <job> <value> Allow redirection from HTTPS to HTTP : Set the 12th bit from right /GETSECURITYFLAGS <job> /SETVALIDATIONSTATE <job> <file-index> <true|false> /GETVALIDATIONSTATE <job> <file-index> /GETTEMPORARYNAME <job> <file-index> The following options control peercaching of a particular job: /SETPEERCACHINGFLAGS <job> <value> /GETPEERCACHINGFLAGS <job> The following options are valid for UPLOAD-REPLY jobs only: /GETREPLYFILENAME <job> Gets the path of the file containing the server reply /SETHELPERTOKEN <job> Sets the current command prompt's primary token as a job's helper token /SETHELPERTOKENFLAGS <job> <flags> /GETHELPERTOKENFLAGS <job> /GETPEERSTATS <job> <file-index> The following options can be placed before the command: The /RAWRETURN option strips new line characters and formatting. Commands that take a <job> parameter will accept either a job name or a job ID |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
示例命令
|
3. 使用 certutil 下载文件
certutil 是一个 Windows 内置的工具,通常用于管理证书,但它也可以用于下载文件。
示例命令:
certutil -urlcache -split -f http://example.com/file.zip C:\path\to\save\file.zip
其中:
http://example.com/file.zip是你要下载的文件 URL。C:\path\to\save\file.zip是你希望保存文件的路径。
certutil 是一个比较简单的工具,但它也能很好地完成基本的文件下载任务。

certutil 工具完整解析(基于截图帮助文档)
一、基础定位与全称
C:\Windows\System32\certutil.exe,底层依托 CryptoAPI、Active Directory 证书服务(AD CS),兼顾系统证书运维、编码转换、AD 证书服务器管理、取证、内网渗透四大场景,是安全运维与渗透高频工具。核心能力总览
- 编码转换:Base64 / 十六进制 / ASN.1/PFX 解析、文件加解密哈希;
- 证书存储管理:本地 / 机器 / 用户证书仓库增删、验证、修复密钥关联;
- AD CS 域证书服务全生命周期管理(CA、证书申请、CRL、备份恢复);
- 密码学底层操作:ECC 曲线、证书签名验证、OCSP、SST 根证书同步;
- 注册表 / 系统配置读写、Hello 登录容器管理、智能卡证书管控。
二、核心命令分组拆解(对应截图动词列表)
1. 编码 / 文件解析组(渗透取证高频)
| 命令 | 功能说明 | 攻防场景 |
|---|---|---|
-dump |
转储证书 / PFX / 配置文件完整明文结构 | 导出证书私钥、读取内网 Web 服务 HTTPS 证书信息 |
-dumpPFX |
解析 PFX 证书包,提取证书 + 私钥 | 窃取域服务器 PFX,伪造身份访问 WMI / 内网 Web 面板 |
-asn |
解析 ASN.1 二进制证书结构 | 分析恶意自签名证书、篡改证书签名 |
-decodehex |
十六进制字符串还原为原始文件 | 还原日志中十六进制载荷、解密隐藏配置 |
-decode |
Base64 解码文件 | 解密 Web/SSRF 外带的 Base64 加密数据(evtx、wbem 仓库文件) |
-encode |
文件转为 Base64 编码 | 内网无文件上传时,分块 Base64 外带敏感文件 |
-hashfile |
生成文件 SHA1/SHA256 哈希 | 取证校验文件完整性、识别恶意 MOF/WMI 脚本 |
2. AD CS 证书服务生命周期管理(域环境核心)
证书申请操作
-deny/-resubmit/-revoke:拒绝、重提交、吊销挂起证书申请;-setattributes/-setextension:修改证书自定义属性、扩展字段(可注入恶意 OID);-isvalid:校验当前证书部署状态;
CA 与 CRL 管理
-CAInfo:查看域证书服务器 CA 根信息;-ca.cert/-ca.chain:获取 CA 根证书、完整证书链;-GetCRL/-CRL:下载、发布证书吊销列表;-shutdown:停止 AD 证书服务;-installCert/-renewCert:安装、续期 CA 根证书;
备份与恢复(域控权限高危操作)
-backup/-backupDB/-backupKey:完整备份 CA 数据库、私钥;-restore/-restoreDB/-restoreKey:恢复证书服务器私钥,可伪造域内任意设备证书;-importPFX:向 CA 导入外部证书私钥;-RecoverKey:恢复存档私钥,实现域身份伪造。
3. 本地证书存储管理(系统信任库)
-store:枚举系统 / 用户证书存储(Root、My、CA 仓库);-enumstore:批量列出存储内所有证书;-addstore/-delstore:添加 / 删除信任根证书;-verifystore:校验仓库证书合法性;-repairstore:修复证书与私钥关联漏洞(提权常用);-SCRoots:批量管理智能卡根证书;
4. 密码学与证书校验工具
-verifykeys:校验公钥私钥配对完整性;-verify/-verifyCTL:校验证书、证书信任列表 CTL;-syncWithWU:从 Windows 更新同步官方根证书;-generateSSTFromWU:生成系统根证书 SST 包;-sign:使用本地私钥重新签名证书 / CRL;- ECC 系列:
-addEccCurve/-deleteEccCurve管理椭圆加密曲线;
5. AD 域信息与模板管理(企业运维)
-ADTemplate/-Template:查看 AD 证书注册模板(域内设备自动申请证书规则);-enrollmentServerURL:管理 CA 注册服务地址,可新增恶意证书下发节点;-MachineInfo/-DCInfo:读取域计算机、域控 AD 对象信息;-pulse:自动执行证书注册任务,后台静默申请恶意证书;
6. 注册表 / 系统底层配置工具
-getreg/-setreg/-delreg:读取、新增、删除证书相关注册表项;-flushcache:刷新 lsass.exe 证书缓存,立刻加载新增恶意根证书;-DeleteHelloContainer:删除 Windows Hello 生物登录密钥容器;
7. 辅助底层工具
-UI:打开图形化 CryptUI 证书窗口;-attest:验证密钥安全证明;-vroot/-vocsproot:创建 OCSP、证书 Web 虚拟站点;-ImportKMS:导入密钥存档服务私钥;
8. 帮助查询语法(截图底部)
certutil -? # 输出全部动词列表(截图当前执行命令)
certutil -dump -? # 单独查看dump子命令详细参数
certutil -v -? # 输出所有命令完整详细帮助文档
三、底层工作原理
- API 依赖分层
命令行输入 → crypt32.dll 证书 API → CryptoNG/CryptoAPI 密码学底层驱动 → 本地证书仓库(
%SystemRoot%\System32\certstore)/ AD CS 域证书数据库; - 证书存储持久化
- 用户证书:注册表
HKCU\Software\Microsoft\SystemCertificates; - 机器全局证书:
HKLM\Software\Microsoft\SystemCertificates,重启仍保留信任关系;
- 用户证书:注册表
- AD CS 交互底层
通过 LDAP/RPC 连接域控证书服务,所有 CA 备份、私钥恢复操作依赖域管理员权限,操作日志写入
Application通道,可通过wevtutil qe Application审计溯源; - 编码转换底层
内置 ASN.1 DER 解析引擎,无需第三方工具,原生支持 Base64、十六进制、PFX 二进制解析,常被用于绕过 Web 上传 / 文件读取过滤(SSRF 读取文件后 Base64 外带)。
四、安全攻防核心场景
🔴 攻击侧利用方式
- 文件无痕迹外带
内网存在 SSRF 漏洞时,
certutil -encode将C:\Windows\System32\wbem\Repository、evtx日志转为 Base64,分段通过 URL 参数带出公网; - 域证书伪造
获取域管理员权限后,
certutil -backupKey导出 CA 私钥,自签名伪造服务器证书,中间人拦截内网 WMI、数据库 HTTPS 流量; - 持久化信任后门
certutil -addstore Root 恶意根证书.cer,系统永久信任攻击者证书,内网中间人长期监听流量;配合flushcache立即生效,无需重启; - 私钥提取提权
-dumpPFX解析服务器部署的 PFX 证书,提取明文私钥,横向登录内网 Web 管理面板、WMI 5985 加密接口; - 绕过文件过滤
Base64 解码功能绕过 Web 上传黑名单,将编码后的后门 MOF 脚本落地执行,植入 WMI 持久化订阅。
🟢 防御与审计手段
- 日志溯源
使用
wevtutil qe Microsoft-Windows-CertificationAuthority/Operational采集所有 certutil 证书操作日志,监控异常 PFX 导出、根证书新增、CA 私钥备份行为; - 组策略管控
限制普通用户执行
certutil -addstore、-backupKey,仅管理员可修改系统根证书仓库; - EDR 监控规则
Defender for Endpoint 告警特征:
certutil -encode/-decode读取系统敏感目录、批量添加根证书、导出 CA 私钥; - 证书基线巡检
定期
certutil -enumstore Root遍历信任根证书,清理未知第三方证书,阻断中间人攻击链路。
五、与你之前学习工具的联动
- wevtutil:采集 certutil 证书操作审计日志,完整溯源证书伪造、文件外带行为;
- bitsadmin:certutil 编码后的 Base64 载荷,通过 BITS 后台任务静默上传至 C2 服务器;
- 隐形 / 隐藏重定向:配合 302 SSRF 跳转,
certutil -decode读取内网服务器本地证书文件; - WMI 体系:提取的证书私钥用于加密 WMI 远程连接,绕过账号认证批量读取 wbem 资产库。
|
certutil /? Verbs: -decodehex -- Decode hexadecimal-encoded file -deny -- Deny pending request -getconfig -- Get default configuration string -installCert -- Install Certification Authority certificate -schema -- Dump Certificate Schema -backup -- Backup Active Directory Certificate Services -store -- Dump certificate store -dsPublish -- Publish certificate or CRL to Active Directory -ADTemplate -- Display AD templates -SCRoots -- Manage smart card root certificates -DeleteHelloContainer -- Delete Hello Logon container. -vroot -- Create/delete web virtual roots and file shares -ImportKMS -- Import user keys and certificates into server database for key archival -add-chain -- (-AddChain) Add certificate chain
CertUtil: -? command completed successfully. |
4. 手动安装 curl 或 wget
如果你需要使用 curl 或 wget 进行文件下载,并且希望它们在 CMD 中可用,你可以手动安装它们:
-
安装
curl:- 从 curl 官网 下载适合你 Windows 版本的
curl可执行文件。 - 解压文件后,将
curl.exe文件放到某个目录中,并将该目录添加到系统的PATH环境变量中,这样你就可以在任何命令行窗口中使用curl了。
- 从 curl 官网 下载适合你 Windows 版本的
-
安装
wget:- 从 wget for Windows 下载 Windows 版本的
wget。 - 将下载的
wget.exe文件放到一个目录中,并将该目录添加到系统的PATH环境变量中。
- 从 wget for Windows 下载 Windows 版本的
安装完成后,你就可以像在 Linux 系统上一样使用 curl 或 wget 命令进行文件下载了。
wget 和 wget2 是用于从网络下载文件的命令行工具。虽然它们的功能相似,但 wget2 是 wget 的一个更新版本,具有一些改进和新特性。以下是它们之间的一些主要区别:
1. 性能和效率
- wget: 传统的
wget工具在处理大文件和高延迟网络时可能效率较低。 - wget2: 设计时考虑了性能优化,支持更高效的下载,尤其是在高延迟或不稳定的网络环境下。
2. HTTP/2 支持
- wget: 仅支持 HTTP/1.1。
- wget2: 原生支持 HTTP/2 协议,允许更快的下载速度和更好的资源利用。
3. 多线程下载
- wget: 不支持多线程下载,所有文件下载都是单线程的。
- wget2: 支持多线程下载,可以同时下载多个文件,从而提高下载速度。
4. 更好的错误处理
- wget: 错误处理相对简单,可能在某些情况下无法恢复下载。
- wget2: 提供了更好的错误恢复机制,能够在网络中断后更有效地恢复下载。
5. 命令行选项和功能
- wget: 拥有丰富的命令行选项,但某些功能可能不够灵活。
- wget2: 在命令行选项上进行了改进,增加了一些新功能,使得使用更加灵活。
6. 依赖性
- wget: 依赖于较少的外部库,通常在大多数 Linux 发行版中预装。
- wget2: 可能依赖于更多的库,尤其是为了支持 HTTP/2 和多线程特性。
7. 开发和维护
- wget: 仍在维护,但更新频率较低。
- wget2: 是一个相对较新的项目,正在积极开发中,添加新特性和修复问题。
wget2 是 wget 的现代化版本,提供了更好的性能、更多的功能和对新技术的支持。如果您需要更高效的下载工具,尤其是在现代网络环境中,wget2 是一个更好的选择。对于简单的下载任务,wget 仍然是一个可靠的工具。
5. 使用 http 命令行工具(适用于 Windows 10 及更新版本)
在 Windows 10 及更新版本中,微软提供了一个名为 http 的命令行工具,它允许你发送 HTTP 请求。
示例命令:
http --download http://example.com/file.zip
这个命令会将指定 URL 的文件下载到当前目录。
6. 使用 start 命令打开浏览器下载
如果你只是想通过浏览器下载文件,也可以通过 start 命令来在默认浏览器中打开下载链接:
start http://example.com/file.zip
这会自动在你的默认浏览器中打开该 URL,然后你可以通过浏览器来手动下载文件。
如果没有 curl 或 wget,你可以使用 PowerShell 的 Invoke-WebRequest,bitsadmin,certutil 等工具下载文件。如果你习惯于使用这些工具,也可以手动安装 curl 或 wget 到你的系统中。这些方法可以满足大部分文件下载需求,尽管命令行的使用体验略有不同。
了解更多关于 Windows 下命令行下载文件的方法,下面是一些额外的技巧和注意事项。
7. 使用 Invoke-RestMethod(PowerShell)
除了 Invoke-WebRequest,PowerShell 还提供了 Invoke-RestMethod 命令,可以用于执行 HTTP 请求并处理响应数据。它非常适合处理 REST API 请求,或者下载文件。
示例命令:
Invoke-RestMethod -Uri "http://example.com/file.zip" -OutFile "C:\path\to\save\file.zip"
与 Invoke-WebRequest 相似,它允许你下载文件并将其保存到指定路径。
8. 使用 wget 在 Windows 上的替代工具
如果你安装了 Windows Subsystem for Linux (WSL),那么你就可以直接在 Windows 上使用 Linux 版本的 wget 和 curl。WSL 是微软提供的一个功能,它允许你运行 Linux 发行版(例如 Ubuntu)作为子系统,提供了一些原生的 Linux 工具和命令行程序。
-
安装 WSL:
- 打开 PowerShell 并以管理员身份运行:
powershellCopy Code
wsl --install - 安装完毕后,重启电脑并选择一个 Linux 发行版(如 Ubuntu)。
- 打开 PowerShell 并以管理员身份运行:
-
在 WSL 环境中,你可以直接使用
wget或curl:bashCopy Codewget http://example.com/file.zip -O /mnt/c/path/to/save/file.zip这个命令将从
http://example.com/file.zip下载文件,并保存到C:\path\to\save\file.zip。
9. 利用脚本自动化下载
如果你需要定期从某个 URL 下载文件,可以使用 PowerShell 或批处理脚本来自动化这个过程。例如,编写一个 PowerShell 脚本来定期下载文件:
$url = "http://example.com/file.zip"
$outputPath = "C:\path\to\save\file.zip"
Invoke-WebRequest -Uri $url -OutFile $outputPath
保存为 download-file.ps1,然后你可以通过任务计划程序(Task Scheduler)定时执行这个脚本来实现定期下载。
10. 通过 FTP 下载文件
Windows 操作系统还内置了支持 FTP(文件传输协议)的功能。如果你需要从 FTP 服务器下载文件,可以使用 ftp 命令。
示例命令:
-
打开命令提示符(CMD)。
-
输入
ftp并连接到 FTP 服务器:cmdCopy Codeftp ftp.example.com -
登录后,你可以使用
get命令下载文件:cmdCopy Codeget /path/to/file.zip C:\path\to\save\file.zip -
完成下载后,使用
bye退出 FTP 会话。
如果你需要通过匿名访问 FTP,只需输入匿名用户和任意密码即可:
ftp -n -s:ftp-commands.txt ftp.example.com
在 ftp-commands.txt 文件中包含以下命令:
user anonymous your-email@example.com
get /path/to/file.zip C:\path\to\save\file.zip
bye
11. 通过 curl 下载带认证的文件
如果你需要下载一个需要身份验证的文件,curl 和 Invoke-WebRequest 都支持 HTTP 基本认证或其他身份验证方法。例如,使用 curl 下载带有用户名和密码的文件:
curl -u username:password -o C:\path\to\save\file.zip http://example.com/protectedfile.zip
对于 Invoke-WebRequest(PowerShell):
$url = "http://example.com/protectedfile.zip"
$outputPath = "C:\path\to\save\file.zip"
$credential = New-Object System.Management.Automation.PSCredential ("username", (ConvertTo-SecureString "password" -AsPlainText -Force))
Invoke-WebRequest -Uri $url -OutFile $outputPath -Credential $credential
12. 使用 aria2 下载文件
aria2 是一个功能强大的多协议下载工具,支持 HTTP、HTTPS、FTP、BT 等协议。在 Windows 上,你可以通过下载安装 aria2 来使用它。
下载并安装 aria2 后,可以使用以下命令进行文件下载:
aria2c -o C:\path\to\save\file.zip http://example.com/file.zip
aria2 支持下载加速,可以通过多线程下载文件,从而提高下载速度。

aria2c 1.37.0 帮助文档完整中文翻译
一、命令使用语法
aria2c [选项] [URI|磁力链接|种子文件|Metalink文件]...
#basic 标签的选项帮助信息:aria2c -h#basic
aria2c --help
基础参数
-v, --version
-h, --help[=标签|关键词]
# 开头。
--help#http 查看所有带#http标签的选项说明;
#basic(基础必用)、#advanced(高级)、#http、#https、#ftp、#metalink、#bittorrent、#cookie、#hook、#file、#rpc、#checksum、#experimental、#deprecated、#help
#basic二、基础文件下载通用选项(#basic / #file)
1. 日志相关
-l, --log=日志文件
- 则日志输出到标准输出。
D:/download/log.txt / -2. 下载目录
-d, --dir=目录路径
C:/Users/Administrator/Downloads
3. 输出文件名
-o, --out=文件名
-d 指定目录为基准;
-Z(批量多文件),此参数会被忽略。
4. 分块多线程下载
-s, --split=N
--max-connection-per-server 限制,可搭配 --min-split-size 使用。
5. 文件预分配方式
--file-allocation=分配方式
none / prealloc / trunc / fallocnone:下载前不预占用磁盘空间,无 IO 损耗prealloc:下载前完整预分配文件空间,大文件耗时久;NTFS、ext4 推荐trunc:调用系统ftruncate快速占位,兼容性最好,老旧 FAT32 推荐falloc:调用posix_fallocate快速分配,速度最快,老旧系统可能无此函数标签:#basic,#file
6. 文件完整性校验
-V, --check-integrity[=true|false]
7. 断点续传
-c, --continue[=true|false]
8. 批量读取下载地址文件
-i, --input-file=文件路径
- 则从标准输入读取地址。
urls.txt / -
9. 全局最大并行下载任务数
-j, --max-concurrent-downloads=N
--split、--optimize-concurrent-downloads 使用。
10. 强制串行单任务下载
-Z, --force-sequential[=true|false]
11. 单服务器最大连接数
-x, --max-connection-per-server=NUM
12. 最小分块大小
-k, --min-split-size=大小
K=1024、M=1024K
20M
三、FTP / HTTP 账号密码配置
FTP 账号
--ftp-user=用户名
--ftp-passwd=密码
HTTP 基础认证
--http-user=用户名
--http-passwd=密码
Cookie 加载
--load-cookies=文件路径
四、BT 下载通用选项(#bittorrent)
1. 打印种子文件内容
-S, --show-files[=true|false]
2. 全局上传速度限制
--max-overall-upload-limit=速度
3. 单任务上传限速
-u, --max-upload-limit=速度
4. 加载种子文件
-T, --torrent-file=种子路径
.torrent种子文件路径
5. BT 监听端口
--listen-port=端口
-;示例 6881,6885 / 6881-6999
6. IPv4 DHT 分布式网络
--enable-dht[=true|false]
7. DHT UDP 监听端口
--dht-listen-port=端口
8. IPv6 DHT 开关
--enable-dht6[=true|false]
--dht-listen-port、--dht-listen-addr6
9. DHT IPv6 绑定地址
--dht-listen-addr6=IPv6地址
五、Metalink 下载配置(#metalink)
-M, --metalink-file=Metalink文件
.meta4/.metalink文件路径;传入 - 从标准输入读取
六、多地址 / 混合下载说明
- 可同时传入 HTTP/FTP 地址、磁力链接、种子、Metalink 文件;
不加
-Z时,多地址指向同一个文件才会合并分块下载,否则下载失败。 - 可混合同时下载 BT 任务与 HTTP 任务,文件会保存至同目录;单任务仅占用设定的单连接上限。
- 磁力链接、种子文件始终作为独立下载任务处理。
- 地址含空格、特殊 shell 符号时,必须用单 / 双引号包裹。
连接数补充说明
- 1.10 版本起,单服务器默认 1 连接,最小分块 20M;文件小于 20M 不会多线程切分。
- 旧版本默认单服务器 4 连接,如需兼容旧行为:
plaintext
aria2c -x4 -k1M
七、程序版权与编译信息
版权声明
启用功能列表
依赖库版本
编译环境
项目仓库地址
|
Usage: aria2c [OPTIONS] [URI | MAGNET | TORRENT_FILE | METALINK_FILE]... Tags: #basic -h, --help[=TAG|KEYWORD] Print usage and exit. Possible Values: #basic, #advanced, #http, #https, #ftp, #metalink, #bittorrent, #cookie, #hook, #file, #rpc, #checksum, #experimental, #deprecated, #help, #all -l, --log=LOG The file name of the log file. If '-' is Possible Values: /path/to/file, - -d, --dir=DIR The directory to store the downloaded file. Possible Values: /path/to/directory -o, --out=FILE The file name of the downloaded file. It is Possible Values: /path/to/file -s, --split=N Download a file using N connections. If more Possible Values: 1-* --file-allocation=METHOD Specify file allocation method. Possible Values: none, prealloc, trunc, falloc -V, --check-integrity[=true|false] Check file integrity by validating piece Possible Values: true, false -c, --continue[=true|false] Continue downloading a partially downloaded Possible Values: true, false -i, --input-file=FILE Downloads URIs found in FILE. You can specify Possible Values: /path/to/file, - -j, --max-concurrent-downloads=N Set maximum number of parallel downloads for Possible Values: 1-* -Z, --force-sequential[=true|false] Fetch URIs in the command-line sequentially Possible Values: true, false -x, --max-connection-per-server=NUM The maximum number of connections to one Possible Values: 1-* -k, --min-split-size=SIZE aria2 does not split less than 2*SIZE byte range. Possible Values: 1024-1073741824 --ftp-user=USER Set FTP user. This affects all URLs. Tags: #basic, #ftp --ftp-passwd=PASSWD Set FTP password. This affects all URLs. Tags: #basic, #ftp --http-user=USER Set HTTP user. This affects all URLs. Tags: #basic, #http --http-passwd=PASSWD Set HTTP password. This affects all URLs. Tags: #basic, #http --load-cookies=FILE Load Cookies from FILE using the Firefox3 format Possible Values: /path/to/file -S, --show-files[=true|false] Print file listing of .torrent, .meta4 and Possible Values: true, false --max-overall-upload-limit=SPEED Set max overall upload speed in bytes/sec. Possible Values: 0-* -u, --max-upload-limit=SPEED Set max upload speed per each torrent in Possible Values: 0-* -T, --torrent-file=TORRENT_FILE The path to the .torrent file. Possible Values: /path/to/file --listen-port=PORT... Set TCP port number for BitTorrent downloads. Possible Values: 1024-65535 --enable-dht[=true|false] Enable IPv4 DHT functionality. It also enables Possible Values: true, false --dht-listen-port=PORT... Set UDP listening port used by DHT(IPv4, IPv6) Possible Values: 1024-65535 --enable-dht6[=true|false] Enable IPv6 DHT functionality. Possible Values: true, false --dht-listen-addr6=ADDR Specify address to bind socket for IPv6 DHT. Tags: #basic, #bittorrent -M, --metalink-file=METALINK_FILE The file path to the .meta4 and .metalink Possible Values: /path/to/file, - URI, MAGNET, TORRENT_FILE, METALINK_FILE: You can specify both torrent file with -T option and URIs. By doing this, Make sure that URI is quoted with single(') or double(") quotation if it About the number of connections Refer to man page for more information. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
aria2c(1) — aria2 1.37.0 documentation
这只是常用选项的一部分, BT (BitTorrent) trackers 是用于帮助 P2P 网络中节点之间交换信息的服务器。在 BitTorrent 协议中,BT trackers 扮演着关键角色,它们用于协调种子与下载者之间的连接,帮助完成文件的共享和分发。 按照功能分类,BT trackers 可以分为以下几种类型:
说明:
总结:不同类型的 BT trackers 各自有不同的使用特点和限制。公开 tracker 更加自由,但可能存在文件质量和下载速度较差的问题;而私人 tracker 提供更高的文件质量和下载速度,但需要邀请码或注册才能访问。随着网络安全和隐私保护的需求不断提高,一些 tracker 也开始加入加密和匿名功能,保障用户隐私。
|
13. 下载大文件时的技巧
如果你在下载大文件时遇到网络中断或者需要恢复下载,可以使用支持断点续传的工具(如 curl、aria2)。例如,使用 curl 下载大文件并支持断点续传:
curl -C - -O http://example.com/largefile.zip
其中 -C - 表示继续下载(即使连接断开后也能恢复)。
如果使用 aria2,可以直接使用类似的参数来支持断点续传:
aria2c -c -o C:\path\to\save\file.zip http://example.com/largefile.zip
Windows 提供了多种方式来下载文件,除了基本的 PowerShell 方法之外,还有一些额外的工具和技巧,可以大大提高下载效率。无论是通过原生的 PowerShell 命令、FTP 客户端,还是安装第三方工具如 aria2、curl 或 wget,你都可以根据需求选择合适的工具。
对于高效下载、自动化或需要高可靠性的下载任务,使用像 aria2 或 curl 这样的工具会更为便捷。
探索 Windows 下的下载技巧,我们可以深入了解一些其他的高级方法以及一些常见的下载问题和解决办法:
14. 使用 BitsTransfer 下载文件
Background Intelligent Transfer Service (BITS) 是 Windows 系统自带的一项服务,用于在后台高效、低带宽地下载文件。BitsTransfer 是一种相对高效的下载方式,适用于需要在后台持续下载的任务,尤其是在不希望影响用户前台操作时。
示例命令:
Start-BitsTransfer -Source "http://example.com/file.zip" -Destination "C:\path\to\save\file.zip"
特点:
- 适用于大文件下载,可以自动恢复中断的下载任务。
- 不占用过多带宽资源,下载过程通常在后台运行,不会干扰前台应用的正常操作。
注意:
BITS的下载方式通常比普通 HTTP 下载更为稳定,适合在网络不稳定时使用。
15. 批量下载文件(使用 wget 或 aria2)
如果你需要从一个列表中批量下载多个文件,工具如 wget 和 aria2 都支持批量下载功能。
-
使用
wget批量下载文件(通过文件列表):首先创建一个包含下载链接的文本文件(如
urls.txt),每一行一个 URL,例如:txtCopy Codehttp://example.com/file1.zip http://example.com/file2.zip http://example.com/file3.zip然后使用以下命令批量下载:
cmdCopy Codewget -i urls.txt -
使用
aria2批量下载:aria2同样支持批量下载,并且可以通过简单的命令实现并行下载。你也可以从文件列表中下载:cmdCopy Codearia2c -i urls.txtaria2默认会并行下载多个文件,这有助于提高下载速度。
16. 使用 curl 下载多个文件并行
如果你使用的是 curl,并且希望同时下载多个文件,可以通过以下方式实现并行下载:
curl -O http://example.com/file1.zip &
curl -O http://example.com/file2.zip &
curl -O http://example.com/file3.zip &
wait
以上命令将在后台并行启动多个下载进程,& 符号用于将每个下载任务放在后台执行,wait 用于等待所有任务完成。
注意:
- 这种方法适合简单的批量并行下载,但无法像
aria2那样高效地控制并发数量。 - 并行下载时,确保你的网络带宽足够支持多个文件的同时下载。
17. 使用 PowerShell 获取 HTTP 响应头信息
有时,在下载文件之前,我们可能需要检查文件的大小、类型或是否存在。你可以使用 PowerShell 的 Invoke-WebRequest 来获取 HTTP 响应头,帮助你更好地控制下载过程。
示例命令:
$response = Invoke-WebRequest -Uri "http://example.com/file.zip" -Method Head
$response.Headers
这个命令会返回文件的 HTTP 响应头信息,包括文件大小(Content-Length),文件类型(Content-Type),以及其他元数据。通过查看文件的大小,你可以决定是否开始下载,或者是否有足够的空间。
18. 使用 curl 获取文件信息
使用 curl 时,可以通过 -I 选项获取文件的 HTTP 响应头:
curl -I http://example.com/file.zip
这将返回文件的 HTTP 头信息,其中包括 Content-Length(文件大小)、Content-Type(文件类型)等信息。
19. 下载带有复杂查询字符串的文件
对于包含复杂查询字符串的 URL(例如,有多个参数的 URL),你可以直接通过命令行工具下载文件。
示例使用 curl:
curl -O "http://example.com/file.zip?param1=value1¶m2=value2"
示例使用 Invoke-WebRequest(PowerShell):
Invoke-WebRequest -Uri "http://example.com/file.zip?param1=value1¶m2=value2" -OutFile "C:\path\to\save\file.zip"
注意:
- 确保 URL 中的查询字符串完全正确,并且特殊字符(如
&,=,?等)没有被错误地转义。
20. 利用 aria2 加速下载(多线程下载)
aria2 支持多线程下载,并且可以在多个连接之间分配下载任务,从而加速下载过程。例如:
aria2c -x 16 -s 16 -o C:\path\to\save\file.zip http://example.com/file.zip
解释:
-x 16表示最多使用 16 个连接来下载文件。-s 16表示从服务器请求文件时使用 16 个分段进行下载。- 这种方式可以大大提高大文件下载的速度,尤其是在高带宽网络下。
21. 解决下载速度慢的问题
如果在下载过程中遇到速度慢的情况,可能与以下因素有关:
- 网络带宽限制:确保没有其他程序占用过多的带宽。
- 下载服务器的带宽限制:某些网站可能对每个连接的下载速度有限制,你可以尝试使用多个连接来加速下载(如通过
aria2的并行下载功能)。 - 更换下载源:如果文件可以通过多个服务器下载,尝试切换到其他服务器或者镜像站点。
- 使用 CDN 加速:一些网站会提供 CDN(内容分发网络)加速功能,选择离你更近的 CDN 节点下载文件,可以提高速度。
22. 防止下载文件损坏(校验文件)
下载过程中,文件可能会损坏。为了确保文件完整,可以使用哈希值(如 MD5、SHA-1 或 SHA-256)来校验下载的文件。
步骤:
- 首先获取文件的哈希值(通常文件提供方会提供)。
- 然后使用工具(如 PowerShell)来计算你下载的文件的哈希值,并与提供的哈希值进行比较。
使用 PowerShell 计算文件的 SHA-256 哈希值:
Get-FileHash "C:\path\to\file.zip" -Algorithm SHA256
如果计算出的哈希值与提供的哈希值一致,说明文件没有损坏。
无论是下载单个文件、批量文件,还是提高下载效率,Windows 提供了多种命令行工具和方法来完成这些任务。从 PowerShell、wget、curl 到第三方工具如 aria2,每种工具都有其适用场景。掌握这些工具的使用方法,可以帮助你在 Windows 上高效、可靠地下载文件。如果遇到下载中断、速度慢或文件损坏等问题,通过工具的高级选项(如多线程、断点续传、文件校验等)可以有效地解决。
探索 Windows 下的下载技巧,我们可以进一步深入了解一些其他实用的技巧和方法,这些技巧不仅有助于提高下载效率,还能帮助你更好地管理下载任务。
23. 使用 PowerShell 自动化下载任务
PowerShell 是一个强大的工具,可以用来自动化和调度下载任务。通过结合脚本,可以定时、批量下载文件,或者在特定条件下自动启动下载。
示例:自动定时下载文件
假设你需要每天定时下载一个文件,可以使用 PowerShell 脚本配合任务计划程序来实现:
-
创建一个 PowerShell 脚本(如
downloadFile.ps1):powershellCopy Code$url = "http://example.com/file.zip" $destination = "C:\path\to\save\file.zip" Invoke-WebRequest -Uri $url -OutFile $destination -
使用 Windows 任务计划程序定时运行该脚本:
- 打开任务计划程序,点击 "创建基本任务"。
- 在触发器中选择 "每天" 或其他适合的时间。
- 在操作中选择 "启动程序",并指向 PowerShell 脚本的路径。
这样,你就可以自动化每天的下载任务了。
24. 使用 wget 下载带认证的文件
如果你需要下载的文件是从需要认证的服务器获取的(如需要用户名和密码),你可以使用 wget 在命令行中加入认证信息。
示例:使用基本认证下载文件
wget --user=username --password=password http://example.com/file.zip
如果网站使用的是其他类型的认证(如令牌或表单认证),你也可以通过 wget 配合请求头(headers)来完成。例如:
wget --header="Authorization: Bearer YOUR_ACCESS_TOKEN" http://example.com/file.zip
注意: 使用命令行时,尤其是涉及敏感信息(如用户名、密码、令牌)时,要特别小心,避免泄露凭证。
25. 处理下载文件中的重定向
很多时候,下载链接会因为重定向而导致下载失败。wget 和 curl 都支持自动处理重定向。
示例:使用 wget 处理重定向
默认情况下,wget 会跟踪 HTTP 重定向。如果遇到重定向链接,wget 会自动跳转到新地址继续下载文件:
wget http://example.com/redirected-file.zip
示例:使用 curl 处理重定向
curl 也可以通过 -L 参数来跟踪重定向:
curl -L http://example.com/redirected-file.zip -o file.zip
使用 -L 参数,curl 会自动跟随所有重定向并下载最终目标文件。
26. 批量下载大文件时的速度优化
如果你需要下载多个大文件,下载速度可能会受到网络波动或服务器限制的影响。为了优化下载速度,可以考虑以下几种方法:
-
使用多线程下载: 使用支持多线程下载的工具(如
aria2)可以显著提高下载速度。aria2会将一个文件分成多个部分进行并行下载,从而提升下载效率。示例命令(最大 16 个线程):
cmdCopy Codearia2c -x 16 -s 16 -d "C:\path\to\save" http://example.com/file1.zip -
切换下载源: 如果某个服务器的下载速度较慢,可以尝试切换到镜像站点或其他 CDN 服务器下载,通常这些服务器离你更近,速度也更快。
-
下载管理工具: 使用下载管理器(如
Internet Download Manager (IDM))可以帮助你加速和管理下载任务。IDM 支持多个线程下载和自动恢复功能,是一个非常受欢迎的工具。
27. 通过下载工具处理限速
许多下载站点对每个连接的速度进行限制,或者根据你的地理位置限制带宽。为了绕过这些限制,使用支持断点续传和多线程下载的工具可以帮助你提升下载速度。
例如:使用 IDM 进行下载
- IDM 支持多线程下载,通过分割文件并行下载,可以大大提升下载速度,尤其是对于下载大文件时。
- 另外,IDM 还支持自动重新连接和恢复下载,适用于不稳定的网络环境。
另外,aria2 也有类似的功能,可以通过调整 -x(最大连接数)和 -s(分段数)来优化下载速度。
28. 使用 aria2 限制下载速度
如果你在下载时需要限制下载的带宽(比如你不想占用全部带宽),可以使用 aria2 来设置速度限制。
示例:限制最大下载速度为 1MB/s
aria2c --max-download-limit=1M -o "file.zip" http://example.com/file.zip
这个命令将会将下载速度限制为每秒 1MB。
29. 下载文件并自动解压
如果你下载的是压缩文件(如 .zip 文件),并且希望在下载完成后自动解压,可以使用 PowerShell 或其他脚本来实现这一功能。
示例:下载并自动解压 .zip 文件(使用 PowerShell)
$url = "http://example.com/file.zip"
$destination = "C:\path\to\save\file.zip"
$extractPath = "C:\path\to\extract\"
# 下载文件
Invoke-WebRequest -Uri $url -OutFile $destination
# 解压文件
Expand-Archive -Path $destination -DestinationPath $extractPath
这个脚本首先下载文件,然后使用 Expand-Archive 命令将下载的 .zip 文件解压到指定目录。
30. 通过 PowerShell 检查下载文件的完整性
如果你希望确保下载的文件没有损坏,除了使用哈希值来校验文件完整性外,你还可以在 PowerShell 中使用 Test-FileHash 来验证文件的哈希。
示例:校验下载文件的哈希值
假设你已经知道目标文件的 SHA-256 哈希值(例如,文件的 MD5 或 SHA-256 校验和),可以使用以下命令验证下载文件的完整性:
$expectedHash = "your_expected_sha256_hash_value"
$filePath = "C:\path\to\downloaded\file.zip"
$actualHash = Get-FileHash -Path $filePath -Algorithm SHA256
if ($actualHash.Hash -eq $expectedHash) {
Write-Host "文件完整,下载成功!"
} else {
Write-Host "文件损坏,下载失败!"
}
通过这种方式,你可以确保下载的文件与预期一致,避免文件损坏的情况。
31. 使用 wget 自动重试下载
如果下载过程中遇到错误或网络问题,可以通过 wget 配置自动重试机制,确保下载任务可以顺利完成。
示例:设置最大重试次数
wget --tries=10 --timeout=30 http://example.com/file.zip
这个命令设置了 wget 在下载失败时最多重试 10 次,每次尝试的超时时间为 30 秒。这样可以避免因为偶尔的网络波动而中断下载任务。
通过合理使用这些高级技巧,你可以在 Windows 上更高效、更可靠地管理下载任务。无论是自动化下载、批量下载,还是处理下载中常见的问题(如限速、重定向、文件损坏等),掌握这些方法能够大大提升你的下载体验。
深入探讨一些更为高级的下载技巧,让你能够在不同场景下提高下载效率和管理能力。
32. 利用 curl 实现多种下载方式
curl 是一个非常灵活的命令行工具,除了支持基本的文件下载外,它还支持多种协议和功能,可以用于更复杂的下载需求。
示例:使用 curl 下载并显示下载进度
curl 默认会显示下载的进度条,表示下载进度、速度、剩余时间等信息。如果你需要更加详细的进度信息,可以使用 -# 参数来让进度条显示得更直观。
curl -# -o "file.zip" http://example.com/file.zip
示例:下载并限制速度
如果你需要限制下载的带宽,可以通过 --limit-rate 参数来控制下载速度:
curl --limit-rate 500k -o "file.zip" http://example.com/file.zip
这个命令将下载速度限制为每秒 500KB。
示例:使用代理下载
如果你需要通过代理服务器进行下载,curl 也支持通过代理来获取文件:
curl -x http://proxyserver:port -o "file.zip" http://example.com/file.zip
这将通过指定的代理服务器下载文件。
33. 下载视频文件
许多人需要下载在线的视频文件,尤其是流媒体网站的视频。在这种情况下,工具如 youtube-dl 或 yt-dlp 变得非常有用。
示例:使用 yt-dlp 下载 YouTube 视频
yt-dlp 是 youtube-dl 的一个增强版本,支持更多网站,并且有更多高级选项。你可以通过以下命令来下载视频:
yt-dlp https://www.youtube.com/watch?v=dQw4w9WgXcQ
该命令将自动下载视频。如果你想要指定保存的文件夹,可以使用 -o 参数:
yt-dlp -o "C:\Downloads\%(title)s.%(ext)s" https://www.youtube.com/watch?v=dQw4w9WgXcQ
示例:下载视频并提取音频
如果你只需要下载音频而不是完整的视频,可以使用以下命令:
yt-dlp -x --audio-format mp3 https://www.youtube.com/watch?v=dQw4w9WgXcQ
这将下载并提取音频,格式为 MP3。
34. 优化大文件下载的稳定性
对于一些特别大的文件(例如,几 GB 以上的文件),下载过程中经常会出现中断或超时的情况。在这种情况下,你可以使用 断点续传 和 多线程下载 来提高下载的稳定性和速度。
断点续传:
许多下载管理工具,如 aria2 或 IDM,都支持断点续传功能。假如你正在下载一个大文件,下载途中出现中断,你可以继续从断点位置重新开始下载,避免重新下载整个文件。
示例:使用 aria2 进行断点续传
aria2c -c -o "largefile.zip" http://example.com/largefile.zip
其中,-c 参数表示继续下载文件,如果文件已经部分下载过,aria2 会从上次中断的地方继续下载。
35. 下载文件并自动备份
在企业环境或个人数据保护需求较高的场景下,下载的文件往往需要自动备份或同步到其他设备。你可以结合 同步工具 或 自动备份软件 来完成这个任务。
示例:使用 robocopy 自动备份下载的文件
robocopy 是 Windows 自带的一个强大复制工具,可以用来同步或备份文件。假设你下载了一个文件,并希望将其自动备份到外部硬盘或云存储目录,你可以创建一个批处理脚本,定期进行备份。
robocopy "C:\path\to\downloaded" "E:\backup\downloaded" /MIR
这个命令会将下载目录中的文件镜像(/MIR)到指定的备份目录。如果你希望定时执行这个备份任务,可以将其添加到任务计划程序中。
36. 使用 aria2 管理多个下载任务
如果你有多个下载任务需要同时进行,可以通过 aria2 来管理多个文件的下载。aria2 支持批量下载,而且支持下载多个文件并行处理。
示例:使用 aria2 下载多个文件
aria2c -i download_list.txt
在 download_list.txt 文件中,列出所有下载链接,每个链接占一行:
http://example.com/file1.zip
http://example.com/file2.zip
http://example.com/file3.zip
使用上述命令后,aria2 会自动并行下载所有列出的文件。
37. 下载文件并使用加密存储
如果你需要下载敏感数据并进行加密存储,可以在下载完成后对文件进行加密。Windows 自带的 BitLocker 或 Veracrypt 可以帮助你加密文件或文件夹,保证下载内容的安全性。
示例:使用 PowerShell 加密文件
你可以在 PowerShell 中使用 Protect-CmsMessage 来加密文件:
$file = "C:\path\to\downloaded\file.zip"
$encryptedFile = "C:\path\to\downloaded\file.zip.encrypted"
Protect-CmsMessage -Path $file -To "recipient@example.com" -OutFile $encryptedFile
这个命令会将下载的文件加密,只有拥有合适解密密钥的人才能访问它。
38. 使用 Cloud Storage 自动同步下载文件
如果你希望下载的文件能自动同步到云存储(例如,Google Drive、OneDrive 或 Dropbox),你可以通过安装这些云存储客户端来实现文件自动同步。大部分云存储客户端都支持 实时同步,只要你将下载的文件放入同步目录,它们会自动上传到云端。
示例:将下载文件自动上传到 Google Drive
- 安装 Google Drive 桌面应用。
- 将文件保存到 Google Drive 的同步文件夹中。这样,下载的文件会在下载完成后自动同步到 Google Drive。
这样,你可以确保下载的文件始终处于云端备份,避免数据丢失的风险。
39. 通过命令行定期下载内容
如果你需要定期从某个网站下载内容(例如日志文件或报告),可以使用任务调度程序和命令行工具(如 curl 或 wget)配合创建定时任务。
示例:使用 Windows 任务计划程序和 curl 定期下载报告
-
创建一个 PowerShell 脚本(例如
downloadReport.ps1):powershellCopy Codecurl -o "C:\path\to\save\report.pdf" "http://example.com/report.pdf" -
打开 任务计划程序,设置一个新的计划任务,每天或每周运行该脚本,从而定期下载最新的报告。
40. 下载时避开地区限制(VPN)
有时你可能会遇到地理限制,导致无法下载某些内容。使用 VPN(虚拟专用网络)可以帮助你绕过这些限制,通过选择其他国家的服务器下载文件。
示例:使用 VPN 配合下载
在 VPN 启动并连接到适当的地区后,你可以使用任何下载工具(如 wget, curl 或下载管理器)进行正常下载。VPN 将使你仿佛位于指定国家,从而突破地区限制。
以上这些技巧和工具,可以帮助你在 Windows 系统下更高效、更安全地进行文件下载、管理下载任务和处理大文件。
使用 PowerShell 下载文件,可以使用 Invoke-WebRequest 命令。以下是一个基本示例:
Invoke-WebRequest -Uri "https://example.com/file.zip" -OutFile "C:\path\to\save\file.zip"
说明:
-Uri:指定要下载文件的 URL。-OutFile:指定文件保存的路径和文件名。
使用 PowerShell 下载文件的另一种方法,可以使用 New-Object System.Net.WebClient 对象的 DownloadFile 方法。这是另一种常见的下载方式。以下是实现下载的命令:
$webclient = New-Object System.Net.WebClient
$webclient.DownloadFile("https://example.com/file.zip", "C:\path\to\save\file.zip")
说明:
New-Object System.Net.WebClient创建一个WebClient对象,专门用于下载文件。DownloadFile方法用于下载指定 URL 的文件并保存到本地指定路径。
除了 Invoke-WebRequest 和 New-Object System.Net.WebClient,你还可以通过其他 PowerShell 方法来下载文件。以下是几种常见的方法:
1. 使用 Start-BitsTransfer 命令
Start-BitsTransfer 是 PowerShell 提供的一个用于文件传输的命令,适用于大文件的下载或上传。它使用后台智能传输服务(BITS),通常用于需要高效、可靠传输的任务。
Start-BitsTransfer -Source "https://example.com/file.zip" -Destination "C:\path\to\save\file.zip"
- 优点:适合大文件下载,具有断点续传功能,支持后台传输。
2. 使用 System.Net.Http.HttpClient 类
可以使用 .NET 的 HttpClient 类来下载文件。此方法提供了更多控制选项,如并发连接、请求头等。
$client = New-Object System.Net.Http.HttpClient
$response = $client.GetAsync("https://example.com/file.zip").Result
$response.Content.ReadAsByteArrayAsync().Result | Set-Content -Path "C:\path\to\save\file.zip" -Force
- 优点:适用于高级应用,可以控制请求的头部和其他细节。
3. 使用 WebRequest 类
另一种方法是使用 .NET 的 WebRequest 类,它提供了对请求和响应的更细粒度控制。
$request = [System.Net.WebRequest]::Create("https://example.com/file.zip")
$response = $request.GetResponse()
$stream = $response.GetResponseStream()
$fs = New-Object System.IO.FileStream("C:\path\to\save\file.zip", [System.IO.FileMode]::Create)
$buffer = New-Object byte[] 1024
while(($read = $stream.Read($buffer, 0, $buffer.Length)) -gt 0) {
$fs.Write($buffer, 0, $read)
}
$fs.Close()
$stream.Close()
- 优点:适合需要详细管理流、处理复杂响应等高级操作。
4. 使用 wget 或 curl 命令(在 Windows 上安装)
如果你在 Windows 上安装了 wget 或 curl,可以通过调用这些工具来下载文件。PowerShell 可以直接执行这些命令。
wget "https://example.com/file.zip" -OutFile "C:\path\to\save\file.zip"
或者:
curl -o "C:\path\to\save\file.zip" "https://example.com/file.zip"
- 优点:这些工具非常简便,可以快速下载文件,也支持很多命令行参数。
总结:
| 方法 | 描述 | 优点 |
|---|---|---|
Invoke-WebRequest |
PowerShell 内置的命令,功能强大 | 适合普通下载需求,支持认证、代理、请求头等功能 |
New-Object System.Net.WebClient |
创建 WebClient 对象进行文件下载 |
简单易用,适合小型文件下载 |
Start-BitsTransfer |
使用 BITS(后台智能传输服务)进行文件传输 | 高效,适合大文件,支持断点续传 |
HttpClient |
使用 .NET 的 HttpClient 类进行下载 |
高级控制,支持异步下载和多种请求选项 |
WebRequest |
使用 .NET 的 WebRequest 类处理下载 |
细粒度控制,适合复杂下载需求 |
wget 或 curl |
使用外部工具(如 wget 或 curl)下载文件 | 简单快速,支持多种命令行选项 |
除了上面提到的方法,还有一些其他的另类下载方式可以用来在 PowerShell 中下载文件,尤其适用于特定的需求或场景。以下是一些常见的另类下载方法:
1. 使用 FTP 下载
如果你需要通过 FTP 下载文件,可以使用 PowerShell 的 WebClient 类来进行 FTP 文件下载。
$ftp = "ftp://example.com/file.zip"
$localPath = "C:\path\to\save\file.zip"
$webclient = New-Object System.Net.WebClient
$webclient.Credentials = New-Object System.Net.NetworkCredential("username", "password")
$webclient.DownloadFile($ftp, $localPath)
- 优点:适用于通过 FTP 协议下载文件,支持认证。
2. 通过 FileInfo 类操作本地文件下载
如果你要从本地系统中传输文件(比如本地网络共享或指定位置),可以使用 FileInfo 类结合网络传输。
$source = "C:\path\to\source\file.zip"
$destination = "\\network\share\path\to\save\file.zip"
$file = New-Object System.IO.FileInfo($source)
$file.CopyTo($destination, $true) # $true 表示覆盖现有文件
- 优点:适用于本地文件的传输或网络共享文件。
3. 使用 WebClient 和 Async 下载
对于需要异步下载的场景,你可以使用 WebClient 类的异步方法进行文件下载,以便不阻塞脚本的其他部分。
$webclient = New-Object System.Net.WebClient
$webclient.DownloadFileAsync("https://example.com/file.zip", "C:\path\to\save\file.zip")
- 优点:异步下载不会阻塞执行,适合需要同时处理其他任务的场景。
4. 通过 SFTP 下载(使用第三方模块)
PowerShell 默认不支持 SFTP(安全文件传输协议),但你可以使用第三方模块,比如 PSSFTP,来实现 SFTP 文件下载。
Install-Module -Name PSSFTP
$session = New-SFTPSession -ComputerName "sftp.example.com" -Credential (Get-Credential)
Get-SFTPFile -SessionId $session.SessionId -RemoteFile "/remote/path/file.zip" -LocalPath "C:\path\to\save\file.zip"
- 优点:适用于需要通过 SFTP 进行安全文件传输的场景。
5. 通过 Powershell 与 Python 脚本结合下载
如果你需要更复杂的下载逻辑,可以结合 Python 的 requests 库进行文件下载,并通过 PowerShell 调用 Python 脚本。
python -c "import requests; r = requests.get('https://example.com/file.zip'); open('C:\\path\\to\\save\\file.zip', 'wb').write(r.content)"
- 优点:适用于需要在 PowerShell 中执行 Python 脚本的场景,尤其是 Python 更适合处理复杂的文件下载任务。
6. 通过 CURL 在 PowerShell 中下载(适用于 HTTP/HTTPS)
Windows 系统默认提供了 curl 工具,可以直接在 PowerShell 中调用进行文件下载。
curl -o "C:\path\to\save\file.zip" "https://example.com/file.zip"
- 优点:
curl语法简洁,支持丰富的功能,适用于 HTTP 和 HTTPS 下载。
7. 通过 Start-Process 运行外部下载工具
如果你已经安装了外部下载工具(例如 aria2c 或 wget),你可以通过 Start-Process 来调用它们下载文件。
Start-Process "aria2c" -ArgumentList "https://example.com/file.zip", "-d", "C:\path\to\save"
- 优点:可以利用外部工具的高效下载功能,比如
aria2支持多线程下载。
8. 通过 Get-Content 和 Out-File 实现下载(适用于文本数据)
如果需要下载文本数据(例如 JSON、CSV 等格式),可以利用 Get-Content 来读取内容,然后使用 Out-File 保存。
$uri = "https://example.com/data.json"
$contents = Get-Content -Uri $uri
$contents | Out-File "C:\path\to\save\data.json"
- 优点:适用于文本文件下载,尤其是 JSON 或 XML 数据。
9. 通过 StreamReader 和 StreamWriter 下载(适用于大文件流)
如果文件比较大,建议使用流操作来逐块下载,避免一次性加载整个文件。
$uri = "https://example.com/largefile.zip"
$webRequest = [System.Net.WebRequest]::Create($uri)
$response = $webRequest.GetResponse()
$stream = $response.GetResponseStream()
$reader = New-Object System.IO.StreamReader($stream)
$writer = New-Object System.IO.StreamWriter("C:\path\to\save\largefile.zip")
while ($line = $reader.ReadLine()) {
$writer.WriteLine($line)
}
$writer.Close()
$reader.Close()
$stream.Close()
- 优点:适用于大文件下载,可以逐块处理,避免内存占用过大。
更高级的下载方式,下面列出几种可选方案:
1. 通过 PowerShell 使用 Invoke-RestMethod
Invoke-RestMethod 是 PowerShell 中的一个命令,可以用来处理 REST API 的请求和响应,通常适用于下载 API 返回的数据或文件。
Invoke-RestMethod -Uri "https://example.com/file.zip" -OutFile "C:\path\to\save\file.zip"
- 优点:简洁,适用于需要处理 HTTP 请求和响应的场景。
2. 通过 System.Net.FtpWebRequest 下载文件(FTP 协议)
你可以使用 FtpWebRequest 来处理 FTP 协议的下载,适合更复杂的 FTP 文件管理。
$ftpUrl = "ftp://example.com/file.zip"
$localFile = "C:\path\to\save\file.zip"
$ftpRequest = [System.Net.FtpWebRequest]::Create($ftpUrl)
$ftpRequest.Method = [System.Net.WebRequestMethods+Ftp]::DownloadFile
$ftpRequest.Credentials = New-Object System.Net.NetworkCredential("username", "password")
$ftpResponse = $ftpRequest.GetResponse()
$ftpStream = $ftpResponse.GetResponseStream()
$fileStream = New-Object System.IO.FileStream($localFile, [System.IO.FileMode]::Create)
$buffer = New-Object byte[] 1024
while ($bytesRead = $ftpStream.Read($buffer, 0, $buffer.Length)) {
$fileStream.Write($buffer, 0, $bytesRead)
}
$fileStream.Close()
$ftpStream.Close()
- 优点:适用于通过 FTP 协议进行复杂文件管理。
3. 通过 DownloadFileAsync 异步下载(非阻塞操作)
当需要在下载的同时进行其他任务时,可以使用异步方法 DownloadFileAsync。
$webclient = New-Object System.Net.WebClient
$webclient.DownloadFileAsync("https://example.com/file.zip", "C:\path\to\save\file.zip")
- 优点:下载过程不会阻塞其他操作,适合多任务处理。
4. 通过 Start-Process 调用外部下载工具
如果你喜欢使用其他下载工具,可以通过 Start-Process 调用它们。
Start-Process "wget" -ArgumentList "https://example.com/file.zip", "-O", "C:\path\to\save\file.zip"
- 优点:利用外部工具,如
wget、curl、aria2等,支持更多高级特性。
5. 使用 Invoke-WebRequest 搭配认证
如果文件需要身份验证,可以在 Invoke-WebRequest 中添加认证信息。
$headers = @{Authorization=("Basic {0}" -f [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("username:password")))}
Invoke-WebRequest -Uri "https://example.com/protectedfile.zip" -Headers $headers -OutFile "C:\path\to\save\file.zip"
- 优点:支持基本的 HTTP 认证,适用于需要认证的文件下载。
6. 通过 HttpListener 启动 HTTP 服务器并提供文件下载
如果你想自己提供文件下载服务,可以通过 HttpListener 创建一个简单的 HTTP 服务器,供其他机器下载文件。
$listener = New-Object System.Net.HttpListener
$listener.Prefixes.Add("http://localhost:8080/")
$listener.Start()
while ($true) {
$context = $listener.GetContext()
$filePath = "C:\path\to\file.zip"
$file = [System.IO.File]::OpenRead($filePath)
$response = $context.Response
$response.ContentType = "application/zip"
$response.ContentLength64 = $file.Length
$file.CopyTo($response.OutputStream)
$response.Close()
}
- 优点:通过本地 HTTP 服务,适合自建下载服务器。
7. 通过 WebClient 结合代理服务器下载
如果下载文件时需要使用代理,可以通过设置代理服务器进行下载。
$proxy = New-Object System.Net.WebProxy("http://proxyserver:8080")
$webclient = New-Object System.Net.WebClient
$webclient.Proxy = $proxy
$webclient.DownloadFile("https://example.com/file.zip", "C:\path\to\save\file.zip")
- 优点:适用于需要通过代理进行下载的场景。
8. 通过 HttpWebRequest 设置自定义请求头
如果需要下载时定制请求头(例如设置 User-Agent),可以使用 HttpWebRequest 来实现。
$uri = "https://example.com/file.zip"
$request = [System.Net.HttpWebRequest]::Create($uri)
$request.Headers.Add("User-Agent", "Mozilla/5.0")
$response = $request.GetResponse()
$stream = $response.GetResponseStream()
$fs = New-Object System.IO.FileStream("C:\path\to\save\file.zip", [System.IO.FileMode]::Create)
$buffer = New-Object byte[] 1024
while (($read = $stream.Read($buffer, 0, $buffer.Length)) -gt 0) {
$fs.Write($buffer, 0, $read)
}
$fs.Close()
$stream.Close()
- 优点:适用于需要自定义请求头的高级用例。
9. 通过 Out-File 和 Invoke-WebRequest 下载文本
对于文本文件或其他非二进制文件,可以直接将下载内容输出到文件。
Invoke-WebRequest -Uri "https://example.com/data.json" | Out-File "C:\path\to\save\data.json"
- 优点:适用于文本文件下载,如 JSON 或 XML 文件。
这些方法可以帮助你在 PowerShell 中实现更为灵活和高效的文件下载。
一个实用、安全、可复用的 PowerShell 模块,封装了 Windows 下常见的文件下载方法(支持多种后端:Invoke-WebRequest、WebClient、BITS、certutil),并包含进度显示、错误处理、哈希校验等企业级功能。
📦 模块名称:DownloadUtils.psm1
# DownloadUtils.psm1
# 用途:提供统一接口下载文件,自动选择最优后端
# 作者:闪现
# 版本:1.0
function Test-CommandExists {
param([string]$cmd)
return [bool](Get-Command $cmd -ErrorAction SilentlyContinue)
}
function Get-TempFilePath {
param([string]$Extension = ".tmp")
return [System.IO.Path]::GetTempFileName() -replace '\.tmp$', $Extension
}
function Invoke-FileDownload {
<#
.SYNOPSIS
下载文件到指定路径,支持多种后端和校验。
.PARAMETER Uri
要下载的文件 URL(必填)
.PARAMETER OutFile
保存路径(必填)
.PARAMETER Hash
可选:预期文件的 SHA256 哈希值(用于校验完整性)
.PARAMETER Method
可选:强制使用特定后端 ('WebRequest', 'WebClient', 'BITS', 'CertUtil')
.PARAMETER UseBasicParsing
是否使用基本解析(避免 IE 引擎依赖,默认 $true)
.EXAMPLE
Invoke-FileDownload -Uri "https://example.com/app.exe" -OutFile "C:\temp\app.exe" -Hash "a1b2c3..."
#>
[CmdletBinding()]
param(
[Parameter(Mandatory)][string]$Uri,
[Parameter(Mandatory)][string]$OutFile,
[string]$Hash,
[ValidateSet('WebRequest', 'WebClient', 'BITS', 'CertUtil')][string]$Method,
[switch]$UseBasicParsing = $true
)
# 确保输出目录存在
$outDir = [System.IO.Path]::GetDirectoryName($OutFile)
if (!(Test-Path $outDir)) { New-Item -ItemType Directory -Path $outDir -Force | Out-Null }
# 自动选择后端(优先级:WebRequest > WebClient > BITS > CertUtil)
$availableMethods = @()
if (!$Method) {
if ($PSVersionTable.PSVersion.Major -ge 3) { $availableMethods += 'WebRequest' }
$availableMethods += 'WebClient'
if (Get-Service -Name BITS -ErrorAction SilentlyContinue | Where-Object Status -eq Running) { $availableMethods += 'BITS' }
if (Test-CommandExists certutil) { $availableMethods += 'CertUtil' }
$Method = $availableMethods[0]
Write-Verbose "Auto-selected download method: $Method"
}
$tempFile = Get-TempFilePath -Extension ([System.IO.Path]::GetExtension($OutFile))
try {
switch ($Method) {
'WebRequest' {
Write-Progress -Activity "Downloading via Invoke-WebRequest" -Status $Uri
$params = @{
Uri = $Uri
OutFile = $tempFile
ErrorAction = 'Stop'
}
if ($UseBasicParsing) { $params.UseBasicParsing = $true }
Invoke-WebRequest @params
}
'WebClient' {
Write-Progress -Activity "Downloading via WebClient" -Status $Uri
$wc = New-Object System.Net.WebClient
try {
$wc.DownloadFile($Uri, $tempFile)
} finally {
$wc.Dispose()
}
}
'BITS' {
Write-Progress -Activity "Downloading via BITS (Background Intelligent Transfer Service)" -Status $Uri
$jobName = "DownloadJob_$(Get-Date -Format 'yyyyMMddHHmmss')"
Start-BitsTransfer -Source $Uri -Destination $tempFile -DisplayName $jobName -ErrorAction Stop
}
'CertUtil' {
Write-Progress -Activity "Downloading via certutil (fallback method)" -Status $Uri
# certutil 会缓存,但我们可以复制出来
$cacheFile = "$env:LOCALAPPDATA\Microsoft\CryptnetUrlCache\Content\$([System.IO.Path]::GetFileName($tempFile))"
certutil -urlcache -split -f $Uri $tempFile | Out-Null
# 注意:某些系统 certutil 直接输出到 $tempFile,无需额外操作
if (Test-Path $cacheFile) {
Copy-Item $cacheFile $tempFile -Force
}
}
default {
throw "Unsupported download method: $Method"
}
}
# 校验哈希(如果提供)
if ($Hash) {
Write-Verbose "Verifying file hash..."
$actualHash = (Get-FileHash -Path $tempFile -Algorithm SHA256).Hash
if ($actualHash -ne $Hash.ToUpper()) {
throw "Hash mismatch! Expected: $Hash, Actual: $actualHash"
}
}
# 移动到最终位置
Move-Item -Path $tempFile -Destination $OutFile -Force
Write-Host "✅ Download completed: $OutFile" -ForegroundColor Green
} catch {
if (Test-Path $tempFile) { Remove-Item $tempFile -Force }
Write-Error "Download failed: $_"
throw
} finally {
Write-Progress -Activity "Downloading" -Completed
}
}
# 导出函数
Export-ModuleMember -Function Invoke-FileDownload
📁 模块部署方式
-
创建模块目录(如未存在):
powershell编辑$modulePath = "$env:USERPROFILE\Documents\PowerShell\Modules\DownloadUtils" New-Item -ItemType Directory -Path $modulePath -Force -
保存上述代码为
DownloadUtils.psm1到该目录 -
导入模块:
powershell编辑Import-Module DownloadUtils -
使用示例:
powershell编辑# 基础下载 Invoke-FileDownload -Uri "https://github.com/.../tool.zip" -OutFile "C:\Tools\tool.zip" # 带哈希校验(推荐用于生产环境) Invoke-FileDownload -Uri "https://example.com/app.exe" -OutFile "C:\app.exe" -Hash "A1B2C3D4..." # 强制使用 BITS(适合大文件后台下载) Invoke-FileDownload -Uri "http://large.file.iso" -OutFile "D:\large.iso" -Method BITS
✅ 模块优势
| 特性 | 说明 |
|---|---|
| 自动降级 | 若首选方法不可用(如 PowerShell < 3.0),自动尝试其他方式 |
| 临时文件安全 | 下载到临时路径,校验通过后再移动,避免部分写入污染 |
| 进度提示 | 使用 Write-Progress 提供可视化反馈 |
| 哈希校验 | 防止下载被篡改或损坏 |
| 错误隔离 | 失败时清理临时文件,不留下垃圾 |
| 兼容性强 | 支持 PowerShell 2.0+(WebClient 路径)到最新版 |
🔒 安全建议
- 永远不要在脚本中硬编码密码。如需认证,使用
-Credential参数(可扩展支持)。 - 对于高敏感环境,建议结合 数字签名验证(如
Get-AuthenticodeSignature)。 - 在受限环境中,
certutil和bitsadmin常被允许,而 PowerShell 可能被禁用——本模块可配合策略灵活切换。
一、Rust 编写的下载工具(主打:极速、多线程、现代)
1. Aria2 (虽然不是 Rust 写的,但常被 Rust 工具替代) -> 替代品:aria2c 的 Rust 实现或 xget
aria2 的现代化替代品或封装,但最纯粹的 Rust 下载器是:2. xget (强烈推荐)
- 特点:用 Rust 编写,支持多线程、断点续传,界面友好(带有进度条),速度非常快。
- 适用场景:通用 HTTP/HTTPS 文件下载。
- CMD 用法:
xget https://example.com/file.zip - 获取方式:在 GitHub Release 页面下载
.exe文件。
3. rust-dl / downloader (泛指类)
aria2 (C++写但标配) 或者 motr。注:目前 Rust 生态中,最强大的其实是
just (任务运行器) 配合脚本,或者专门的视频下载器。4. youtube-dl 的 Rust 重写版:yt-dlp (Python) 的竞争对手 -> tube 或 ytdl-rs
- 工具名:
tube或ytdl-rs - 特点:比 Python 版的 youtube-dl 启动速度快几十倍,无依赖。
- CMD 用法:
tube https://www.youtube.com/watch?v=xxxx
5. rustcat / rcp (简单传输)
- 用于简单的文件传输,类似 netcat 但更安全快速。
二、Python 编写的下载工具(主打:功能强大、脚本化、视频专用)
.exe 版本。1. yt-dlp (视频下载神器,必装)
- 地位:目前全球最强的命令行视频下载工具,是
youtube-dl的活跃分支。 - 语言:Python。
- 特点:支持全球数千个视频网站,可下载最高画质、字幕、播放列表,速度极快。
- CMD 用法:
yt-dlp -f best https://www.youtube.com/watch?v=xxxx - 注意:虽然有 Python 源码,但建议直接下载
yt-dlp.exe(已打包),这样不需要安装 Python 即可在 CMD 运行。
2. wget / curl (Python 脚本版)
3. pipx 运行的临时下载脚本
三、特别提及:Rust 编写的 Python 包管理下载加速工具
uv。- 工具名:
uv - 语言:Rust。
- 用途:它不是用来下载普通文件的,而是用来极速下载 Python 包 (pip) 和管理 Python 版本的。
- 为什么提它:它比传统的
pip快 10-100 倍,彻底解决了 Python 下载依赖慢的问题。 - CMD 用法:
uv pip install requests
总结与推荐方案
| 需求场景 | 推荐工具 | 语言 | 优点 | 下载建议 |
|---|---|---|---|---|
| 通用文件下载 (HTTP/HTTPS) | xget 或 aria2c |
Rust / C++ | 多线程、断点续传、极速 | 下载单文件 .exe 放入系统路径 |
| 视频/音频下载 | yt-dlp |
Python (有.exe版) | 支持站点最多、功能最强 | 下载 yt-dlp.exe |
| Python 包/环境管理 | uv |
Rust | 比 pip 快百倍、一体化管理 | 通过 powershell/cmd 一键安装 |
| 简单快速测试 | curl (系统自带) |
C | 无需安装、系统内置 | 直接使用 |
如何在 CMD 中开始使用?
-
对于
yt-dlp(视频):- 访问 GitHub 搜索
yt-dlp releases。 - 下载
yt-dlp.exe。 - 将其移动到
C:\Windows\System32或任意你在 PATH 中的文件夹。 - 打开 CMD 输入
yt-dlp --version验证。
- 访问 GitHub 搜索
-
对于
xget(通用文件):- 访问 GitHub 搜索
xget rust(注意甄别,因为同名项目多,推荐找 star 高的如XGETby varun-raj 或类似项目)。 - 备选方案:如果找不到满意的纯 Rust 通用下载器,
aria2c(虽不是 Rust 但是标准) 依然是王道,或者使用motr。 - 更正:目前 Rust 生态中有一个非常流行的叫
downloader或者fetch的 CLI 工具,但最稳定的建议还是使用aria2(配置好并发) 或者尝试rust-get类项目。
- 访问 GitHub 搜索
在 CMD 中保留
curl (系统自带) 处理小文件,安装 yt-dlp.exe 处理视频,安装 uv (Rust 编写) 来管理所有 Python 相关的下载需求。

浙公网安备 33010602011771号