如何通过RDP命令行从远程Windows机器复制文件或执行命令?
既然所有常规的远程管理工具都被安全规则卡死了,那咱们就从RDP本身的特性入手——毕竟你已经能通过RDP连接所有机器,这就足够覆盖你的需求了。下面分「远程执行命令」和「批量复制日志」两个场景给你可行的命令行方案:
一、通过RDP命令行在远程机器执行命令
你可以借助RDP的「远程应用模式」直接启动命令提示符执行命令,不用进入完整桌面,完全可以用命令行自动化:
单次执行命令的快速方式
直接用mstsc的参数指定启动远程cmd并执行命令:
mstsc.exe /v:REMOTE_HOST_IP_OR_NAME /admin /start:C:\Windows\System32\cmd.exe /startargs:"/c 你的命令 && exit"
比如要在远程机器上压缩日志文件:
mstsc.exe /v:dev-machine-01 /admin /start:cmd.exe /startargs:"/c powershell Compress-Archive -Path C:\dev_logs\*.txt -DestinationPath C:\temp\logs_$(date /t).zip && exit"
参数解释:
/v:指定远程机器的IP或主机名/admin以管理员身份连接(如果需要访问系统目录或高权限文件)/start指定远程会话启动后运行的程序(这里是cmd.exe)/startargs传递给cmd的参数,/c表示执行命令后退出,&& exit确保命令完成后自动关闭RDP会话
批量执行的脚本方式
如果要给80台机器批量执行命令,写个批处理脚本循环处理即可:
@echo off setlocal enabledelayedexpansion :: 把所有机器的IP/主机名列在这里,空格分隔 set "MACHINES=dev-machine-01 dev-machine-02 dev-machine-03 ..." for %%m in (%MACHINES%) do ( echo === Executing command on %%m === mstsc.exe /v:%%m /admin /start:cmd.exe /startargs:"/c echo Hello from %%m > C:\temp\test.txt && exit" /wait ) echo All commands executed!
/wait 参数会让脚本等当前RDP会话结束后再处理下一台机器。
二、通过RDP命令行复制远程机器的日志文件
这个场景最实用的是利用RDP的本地磁盘重定向特性——RDP会把你的本地磁盘映射到远程机器的\\tsclient\盘符路径下,你可以直接在远程cmd里把日志复制到这个映射路径,等同于复制到本地。
单次复制的命令行方式
mstsc.exe /v:REMOTE_HOST /admin /redirectdrives /start:cmd.exe /startargs:"/c copy C:\dev_logs\*.txt \\tsclient\C\collected_logs\ && exit"
参数解释:
/redirectdrives启用本地磁盘重定向,远程机器能访问你本地的所有磁盘(比如\\tsclient\C对应你本地的C盘)- 后半部分的
copy命令就是把远程日志复制到本地的C:\collected_logs目录,记得先在本地创建这个目录
批量收集日志的脚本方案
写一个批处理脚本,自动循环处理80台机器,还能预先保存凭据避免重复输入密码:
@echo off set "LOCAL_LOG_DIR=C:\collected_dev_activity_logs" mkdir "%LOCAL_LOG_DIR%" 2>nul :: 预先添加凭据(仅需执行一次,之后脚本无需输入密码) :: cmdkey /add:REMOTE_HOST /user:YOUR_DOMAIN\YOUR_USERNAME /pass:YOUR_PASSWORD :: 机器列表,每行一个主机名/IP set "MACHINES=dev-machine-01 dev-machine-02 dev-machine-03 ..." for %%m in (%MACHINES%) do ( echo === Collecting logs from %%m === :: 生成临时RDP配置文件(避免命令行参数过长) echo full address:s:%%m > temp_session.rdp echo admin session:i:1 >> temp_session.rdp echo redirectdrives:i:1 >> temp_session.rdp echo remoteapplicationmode:i:1 >> temp_session.rdp echo remoteapplicationprogram:s:C:\Windows\System32\cmd.exe >> temp_session.rdp :: 复制所有用户的日志到本地目录,注意路径转义 echo remoteapplicationcmdline:s:/c "copy C:\Users\*\ActivityLogs\*.txt \\tsclient\C%LOCAL_LOG_DIR:\=\\% && exit" >> temp_session.rdp echo prompt for credentials:i:0 >> temp_session.rdp :: 启动会话并等待完成 mstsc.exe temp_session.rdp /wait del temp_session.rdp ) echo Done! All logs saved to %LOCAL_LOG_DIR%
注意:
- 如果你的账号在所有机器上密码相同,执行一次
cmdkey命令添加凭据,脚本里的prompt for credentials:i:0会自动使用保存的凭据,不用手动输入密码 - 日志路径根据实际情况修改,比如如果日志在固定路径就替换成你的真实路径
备选方案:利用剪贴板重定向传输小文件
如果磁盘重定向被意外限制(比如权限问题),可以用RDP的剪贴板共享传输单个小文件:
- 远程机器把文件内容复制到剪贴板:
mstsc.exe /v:REMOTE_HOST /admin /start:cmd.exe /startargs:"/c clip < C:\dev_logs\single_log.txt && exit" - 本地把剪贴板内容导出到文件:
clip > local_single_log.txt
这个方法适合小文件,批量处理的话可以用PowerShell配合Get-Clipboard命令实现自动化。
最后提醒
- 确保你的账号在所有远程机器上有日志文件的读取权限,以及本地目录的写入权限
- 建议先在1-2台测试机器上验证脚本,没问题再批量执行
- 尽量避开开发者的工作高峰,以免影响正常开发
内容的提问来源于stack exchange,提问作者SATO Yusuke




