Python远程控制Windows服务器的实操指南
本文详细演示如何使用 Python 通过 PyWinRM、Paramiko 与 Pypsexec 远程控制 Windows 服务器。涵盖命令执行、文件传输与定时任务配置步骤,提供完整代码示例与环境准备参数,适用于运维自动化与日常远程管理场景。
一、环境准备与依赖安装
在发起远程控制前,目标 Windows 服务器需开启对应的通信端口与身份验证方式。推荐使用以下两种常用方案:
- WinRM 方案:适合原生 Windows 环境。以管理员身份运行 PowerShell,执行
Enable-PSRemoting -Force启用远程管理,并确保防火墙放行 5985 (HTTP) 或 5986 (HTTPS) 端口。 - OpenSSH 方案:Windows Server 2019+ 可在“设置 → 应用 → 可选功能”中安装
OpenSSH Server。安装后在“服务”管理器中启动OpenSSH Authentication Server并设置为自动启动。
准备工作完成后,在本地开发机安装 Python 依赖库:
pip install pywinrm paramiko pypsexec scp
二、核心控制方法实现
第1步:使用 PyWinRM 通过 PowerShell 远程执行命令
目的:利用微软原生 WinRM 协议执行系统级命令,返回标准输出。入口:Python 脚本。关键参数为服务器 IP、5985 端口及凭据。
import winrm
# 建立会话
session = winrm.Session('http://<服务器IP>:5985/wsman', auth=('用户名', '密码'))
# 执行命令并解码输出
result = session.run_cmd('ipconfig /all')
print(result.std_out.decode('utf-8'))
第2步:利用 Paramiko 建立 SSH 会话并交互
目的:基于 SSH 协议进行跨平台兼容控制。适用于已部署 OpenSSH 的环境。注意首次连接需信任主机密钥。
import paramiko
# 创建客户端并忽略首次主机密钥警告
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
client.connect('<服务器IP>', username='用户名', password='密码', timeout=10)
# 执行命令并捕获 stdout/stderr
stdin, stdout, stderr = client.exec_command('systeminfo')
print(stdout.read().decode('utf-8'))
if stderr.channel.recv_exit_status() != 0:
print('Error:', stderr.read().decode('utf-8'))
client.close()
第3步:通过 Pypsexec 调用 PsExec 执行高级进程
目的:无需在服务端长期驻留守护进程,通过临时服务上传并运行可执行程序或批处理脚本。该方式权限较高,适合复杂任务。
from pypsexec.client import Client
# 初始化客户端
client = Client('<服务器IP>', username='用户名', password='密码')
# 连接并创建服务端临时服务
client.connect()
client.create_service()
# 执行命令行程序(示例:列出 C 盘根目录)
stdout, stderr, rc = client.run_executable('cmd.exe', arguments='/c dir c:\\')
print('Return Code:', rc)
print(stdout.decode())
# 清理临时服务并断开
client.remove_service()
client.disconnect()
三、进阶应用:定时任务与文件传输
1. 定时任务调度
目的:定期在远端执行维护操作。若涉及日志清理或删除操作,请务必提前备份重要数据,防止误删导致业务中断。
import time
import sched
import winrm
def clear_remote_logs():
session = winrm.Session('http://<服务器IP>:5985/wsman', auth=('用户名', '密码'))
# 仅示例,实际生产环境请替换为真实备份逻辑
result = session.run_cmd('del /q C:\\Logs\\*.log')
print(result.std_out.decode('utf-8'))
# 初始化调度器
scheduler = sched.scheduler(time.time, time.sleep)
# 安排任务间隔 86400 秒(24小时)执行一次
scheduler.enter(86400, 1, clear_remote_logs)
scheduler.run()
2. 安全文件传输
目的:通过 SCP 协议实现本地与服务器间的文件双向同步。
import paramiko
from scp import SCPClient
# 复用 SSH 连接实例
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('<服务器IP>', username='用户名', password='密码')
# 使用 SCP 客户端进行传输
with SCPClient(client.get_transport()) as scp:
# 上传本地文件到服务器
scp.put('local_config.json', 'C:/Users/Admin/app/local_config.json')
# 下载服务器文件到本地
scp.get('C:/Users/Admin/app/local_config.json', './backup_config.json')
client.close()
四、完成判断与常见排错
验证是否成功接入的方法为检查控制台输出是否返回预期的系统信息或文件列表。若连接超时或报 Access Denied,请按以下路径排查:
- 确认目标服务器未禁用远程管理策略(组策略:计算机配置 → 管理模板 → Windows 组件 → Windows 远程管理 (WinRM) → WinRM 服务)。
- 检查防火墙入站规则是否放行对应端口,必要时临时关闭测试以排除拦截。
- 若使用 Paramiko 连 SSH,确认 OpenSSH Server 服务状态及
sshd_config中的PasswordAuthentication yes设置。
五、简要总结
Python 配合 PyWinRM、Paramiko 与 Pypsexec 可覆盖绝大多数 Windows 服务器的远程管控需求。根据网络环境与权限要求选择合适协议,结合调度模块与 SCP 库即可搭建稳定的自动化运维链路。以上就是 Python 远程控制 Windows 服务器实操方法的详细内容,更多关于 Python 自动化运维的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









