目录
  • 1. 被控端 windows
    • 启动 winrm 服务
    • 检查 winrm 服务监听状态
    • 查看 winrm 配置信息(可选)
    • 配置 winrm client
    • 配置 winrm service
  • 2. 控制端
    • 3. 实战一下
      • 4. 总结

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

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

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

        官网地址

        1. 被控端 windows

        这里以 Windows 10 系统机器为例

        具体操作步骤如下:

        启动 winrm 服务

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

        # 启动winrm服务
        winrm quickconfig -q
        

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

        Python远程控制Windows服务器的方法详解

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

        Python远程控制Windows服务器的方法详解

        检查 winrm 服务监听状态

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

        PS:注意这里的端口号 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. 实战一下

        做为以上准备后,我们就可以编写代码对 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 批处理文件,又或者是模拟命令行输入,根据返回值进行其他骚操作

        声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。