用 Python 远程控制 Windows 服务器,太好用了!

Python客栈

共 2791字,需浏览 6分钟

 ·

2022-05-17 05:46

在很多企业会使用闲置的 Windows 机器作为临时服务器,有时候我们想远程调用里面的程序或查看日志文件

Windows 内置的服务「 winrm 」可以满足我们的需求

它是一种基于标准简单对象访问协议( SOAP )的防火墙友好协议,允许来自不同供应商的硬件和操作系统进行互操作

官网:

https://docs.microsoft.com/en-us/windows/win32/winrm/portal

1. 被控端 windows

这里以 Windows 10 系统机器为例

具体操作步骤如下:

1-1 启动 winrm 服务

以管理员权限打开 CMD 命令窗口,输入下面命令启动 winrm 服务

# 启动winrm服务
winrm quickconfig -q

如果运行报错,提示网络类型设置异常

可以快捷键 win+i 进入到网络和 Internet,更改网络配置文件,由公用切换为专用

1-2  检查 winrm 服务监听状态

继续在命令行输入下面命令,查看 winrm 服务的状态

PS:注意这里的端口号 Port 值后面连接会用到

# 查看winrm服务的状态
winrm e winrm/config/listener

# 结果
Listener
    Address = *
    Transport = HTTP
    Port = 5985
    Hostname
    Enabled = true
    URLPrefix = wsman
    CertificateThumbprint
    ListeningOn = **

1-3 查看 winrm 配置信息(可选)

通过以下命令可以查看 winrm 全部配置信息、client 客户端配置信息、service 服务端配置信息

# 全部
winrm get winrm/config

# Client
winrm get winrm/config/client

# Service
winrm get winrm/config/service

1-4  配置 winrm client

# 配置winrm client
winrm set winrm/config/client @{AllowUnencrypted="true"}

winrm set winrm/config/client @{TrustedHosts="*"}

winrm set winrm/config/client/auth @{Basic="true"}

1-5  配置 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. 实战一下

做为以上准备后,我们就可以编写代码对 Windows 进行控制了

首先,我们需要 ip 地址、端口号、用户名、密码连接 Windows 被控端

# 连接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 批处理文件,又或者是模拟命令行输入,根据返回值进行其他骚操作

我已经将文中全部代码上传到后台,回复关键字「 winrm 」获取完整源码

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

往期推荐
1、神器!竟能把图片视频无损清晰放大N倍!
2、Python 字符串深度总结
3、浏览器可以运行 Python 代码了,Python 也许会变成前后端通吃的语言
4、Python 你可能从未听说过的5种隐藏技巧
5、用Python写个魂斗罗
点击关注公众号,阅读更多精彩内容
浏览 22
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报