python 通过winrm实现远程控制windows机器

332 阅读4分钟

python 通过winrm实现远程控制windows机器

背景

工作中某些场景需要批量操作远程windows机器上的文件或程序,一台一台mstsc远程到桌面上去操作,效率低下且繁琐。

解决方案

通过winrm接口,远程执行dos命令,实现文件和程序的操作

WinRM介绍

WinRM(Windows Remote Management)是Windows操作系统提供的一种基于Web服务的远程管理接口,它允许用户在本地或通过企业网络远程管理Windows计算机。WinRM提供了一种标准化的方法来执行管理任务,如运行脚本、配置系统设置和安装软件等。

开启WinRM服务

cmd命令行输入:
# 开启服务
1.winrm quickconfig
 会有两次确认 

# 查看监听端口等信息
2.winrm e winrm/config/listener
 
# 授权
3.winrm set winrm/config/service/auth @{Basic="true"}
 
# 不加密模式
4.winrm set winrm/config/service @{AllowUnencrypted="true"}

python调用WinRM

# pip install pywinrm 安装模块

import winrm

# 默认端口是:5985
con = winrm.Session('http://12.34.567.888:5985/wsman', auth=("administrator", "23423423***"))
# 杀掉进程
con.run_cmd("taskkill /f /pid 6748")

使用WinRM启动程序时的问题

使用con.run_cmd("dos命令")语句,可以通过远程执行dos指令,实现文件操作和程序的关闭。问题出现在通过WinRM接口执行start命令时,会发现无法正常启动图形界面程序,只能启动程序进程,不能正常启动程序的图形化界面。

无法正常启动图形界面的可能原因

  1. 会话隔离:WinRM在远程执行命令时通常运行在一个隔离的会话中,这个会话可能没有访问图形用户界面(GUI)的权限或能力。
  2. 用户交互限制:WinRM主要用于自动化和脚本执行,不支持用户交互。因此,即使EXE程序启动了,它的图形界面也无法在没有交互式登录会话的情况下显示。
  3. 权限问题:使用WinRM执行命令可能不是在当前登录用户的上下文中执行的,尤其是如果远程计算机的策略限制了非交互式登录会话的权限。
  4. 远程桌面服务:如果远程计算机没有启用远程桌面服务或远程桌面会话主机(RD Session Host)角色,图形界面可能无法通过WinRM显示。
  5. 任务栏和桌面环境:WinRM不提供任务栏和桌面环境,因此即使程序窗口被创建,它也没有地方显示。

曲线救国方案

使用windows任务计划程序,提前配置需要启动的程序任务,通过WinRM接口执行任务计划程序。

代码实现:

def exec_windows_task(conn, task_name):
    """
    执行windows任务计划程序
    :return:
    """
    logger.info(f"执行Windows任务计划程序,名称为:{task_name}")
    conn.run_cmd(f'schtasks /run /tn {task_name}')

方案可行的原因

  1. 任务计划程序的权限:Windows任务计划程序可能以具有启动图形界面权限的用户账户运行,这可能包括交互式用户或具有适当权限的服务账户。
  2. 任务计划程序的配置:任务计划程序可以配置为在特定的用户上下文中运行任务,这可能包括与当前登录用户相同的权限,允许程序显示图形界面。
  3. 用户会话利用:当任务计划程序触发一个任务时,它可能利用了当前用户会话来启动程序,这允许程序的图形界面在当前会话中显示。
  4. 系统策略和设置:可能存在系统策略或设置,允许任务计划程序绕过WinRM的限制,以交互方式启动程序。
  5. 任务计划程序的特殊行为:任务计划程序可能具有特殊的行为或权限,允许它启动具有图形界面的应用程序,即使它们是通过远程会话触发的。
  6. 交互式服务:任务计划程序可能配置为以交互式服务的方式运行,这允许它与桌面交互,即使实际的命令是从远程会话发起的。

现在,我们就通过python脚本调用WinRM服务实现了远程控制windows机器上的文件和程序。撒花