利用Python和WinRM远程管理Windows服务器
本文详解如何使用Python通过WinRM协议远程管理Windows服务器。内容涵盖Windows端WinRM服务的启动、防火墙设置及客户端配置,以及控制端安装pywinrm依赖库。通过具体代码示例,演示如何建立连接并远程执行CMD命令或PowerShell脚本,实现日志查看与批处理文件运行,适用于企业闲置Windows机器的远程运维场景。
许多企业会将闲置的Windows机器用作临时服务器,在实际运维中,远程调用这些机器内的程序或查看日志文件是常见需求。
Windows系统内置的「winrm」服务能够有效满足此类远程管理需求。
WinRM是一种基于简单对象访问协议(SOAP)的防火墙友好型协议,旨在允许不同供应商的硬件和操作系统之间进行互操作。
关于WinRM的更多官方信息,可访问其官网地址查阅。
1. 被控端Windows配置
本文以Windows 10系统机器为例进行说明。
具体操作步骤如下:
启动winrm服务
请以管理员权限打开CMD命令窗口,并输入以下命令来启动winrm服务。
# 启动winrm服务
winrm quickconfig -q
若运行时报错并提示网络类型设置异常,请继续后续步骤进行调整。

此时可按下快捷键win+i进入“网络和Internet”设置,更改网络配置文件,将网络类型由“公用”切换为“专用”。

检查winrm服务监听状态
继续在命令行输入以下命令,以查看winrm服务的当前状态。
注意:请记录输出结果中的端口号Port值,后续连接时将用到该端口。
# 查看winrm服务的状态
winrm e winrm/config/listener
# 结果
Listener
Address = *
Transport = HTTP
Port = 5985
Hostname
Enabled = true
URLPrefix = wsman
CertificateThumbprint
ListeningOn = **
查看winrm配置信息(可选)
通过以下命令可以分别查看winrm的全部配置信息、client客户端配置信息以及service服务端配置信息。
# 全部
winrm get winrm/config
# Client
winrm get winrm/config/client
# Service
winrm get winrm/config/service
配置winrm client
# 配置winrm client
winrm set winrm/config/client @{AllowUnencrypted="true"}</code>
<code>winrm set winrm/config/client @{TrustedHosts="*"}</code>
<code>winrm set winrm/config/client/auth @{Basic="true"}
配置winrm service
在完成winrm service和winrm client的配置后,建议通过步骤1-3中的命令检查配置文件,确保配置已生效。
# 配置winrm service
winrm set winrm/config/service @{AllowUnencrypted="true"}
winrm set winrm/config/service/auth @{Basic="true"}2. 控制端环境准备
在控制端(如Mac OSX或Linux系统)上,只需安装「pywinrm」依赖包即可进行后续操作。
# 控制端安装依赖包
pip3 install pywinrm
3. 实战代码示例
完成上述准备工作后,即可编写Python代码对Windows被控端进行控制。
首先,需要获取目标Windows机器的IP地址、端口号、用户名及密码,以此建立连接。
# 连接windows
import winrm
...
# ip地址:端口号
# winrm server端口号
# auth:用户名和密码
self.session = winrm.Session("192.168.**.**:5985", auth=('username', 'password'), transport='ntlm')
...连接成功后,即可利用对象的「run_cmd」和「run_ps」函数来模拟CMD或PowerShell的命令行输入。
此处以查看Windows某硬盘目录下的日志文件为例进行演示。
# 连接windows
import winrm
import codecs
...
def exec_cmd(self, cmd):
"""
执行cmd命令,获取返回值
:param cmd:
:return:
"""
# CMD
result = self.session.run_cmd(cmd)
# powerShell
# result = self.session.run_ps(cmd)
# 返回码
# code为0代表调用成功
code = result.status_code
# 根据返回码,获取响应内容(bytes)
content = result.std_out if code == 0 else result.std_err
# 转为字符串(尝试通过UTF8、GBK进行解码)
# result = content.decode("utf8")
# result = codecs.decode(content,'UTF-8')
try:
result = content.decode("utf8")
except:
result = content.decode("GBK")
print(result)
return result
...
# 打开文件D:/py/log/trade.log
# windows使用type命令,查看文件内容
result = self.exec_cmd('D: &cd py\\log &type trade.log')
# 查看结果
print(result)
4. 总结
除了远程查看Windows文件外,该方法还可用于执行bat批处理文件,或模拟命令行输入并根据返回值执行其他操作。
至此,关于Python远程控制Windows服务器的方法详解已介绍完毕,更多相关内容可搜索本站历史文章或继续浏览后续文章,感谢支持。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









