如何自动化连接Azure AAD认证的本地Windows VM并实现文件传输与命令执行
解决方案
1. WinRM 结合 AAD 认证(优先推荐)
既然组织禁止获取明文凭据,WinRM的AAD身份验证是合规的最优方向,无需存储账号密码,直接利用当前用户的AAD身份或服务主体完成认证。可以用pypsrp库(对WinRM认证的支持比pywinrm更全面)实现:
命令执行示例
from pypsrp.client import Client from pypsrp.powershell import PowerShell, RunspacePool # 初始化WinRM客户端,使用AAD用户身份认证 client = Client( "your-vm-hostname", auth="azuread", username="your-aad-username@your-domain.com", certificate_validation=False # 测试环境可临时关闭,生产环境建议配置合法证书 ) # 执行PowerShell命令并获取输出 with RunspacePool(client) as pool: ps = PowerShell(pool) ps.add_command("Get-ChildItem -Path C:\\temp") output = ps.invoke() for item in output: print(f"文件/文件夹:{item.properties['Name'].value}")
文件传输示例
pypsrp支持通过WinRM直接传输文件,无需额外部署SFTP服务:
from pypsrp.client import Client client = Client( "your-vm-hostname", auth="azuread", username="your-aad-username@your-domain.com" ) # 上传本地文件到远程VM client.copy("local-file-path\\example.txt", "C:\\remote-folder\\example.txt") # 下载远程文件到本地 client.copy("C:\\remote-folder\\result.log", "local-save-path\\result.log", remote_to_local=True)
2. Pywinauto 自动化 RDP(无WinRM权限时备选)
如果目标VM未开启WinRM服务,只能模拟手动RDP操作,用pywinauto操控mstsc.exe完成登录和后续操作(注意:该方式依赖UI元素定位,稳定性受VM分辨率、登录界面改版影响):
示例代码
from pywinauto import Application import time # 启动远程桌面客户端 app = Application().start("mstsc.exe") # 填写VM地址并发起连接 rdp_dlg = app.window(title="远程桌面连接") rdp_dlg.Edit.set_text("your-vm-hostname") rdp_dlg.connect() # 等待AAD登录窗口加载(需根据实际登录界面调整等待时长和控件定位) time.sleep(5) login_app = Application().connect(title_re="Azure AD 登录") # 模拟点击"使用工作或学校账户登录"按钮(控件名称需根据实际界面确认) login_app.window().Button.click() # 登录完成后,操控远程桌面内的程序 rdp_window = Application(backend="uia").connect(title_re="your-vm-hostname - 远程桌面") # 示例:打开CMD执行命令 rdp_window.type_keys("{WIN}r") rdp_window.window(title="运行").Edit.set_text("cmd") rdp_window.window(title="运行").Button.click() rdp_window.window(title="命令提示符").type_keys("dir C:\\temp{ENTER}")
3. 其他可行方向
- PowerShell远程会话+Python调用:如果本地已配置好AAD认证的PowerShell远程会话,可通过Python的
subprocess模块直接调用Invoke-Command和Copy-Item命令,无需额外安装Python库。 - 组织内部管理工具集成:对接组织内部的AD集成远程管理API,或利用Ansible等自动化工具的WinRM AAD插件完成操作。
内容的提问来源于stack exchange,提问作者Anshuman Kumar
相关产品推荐
相关产品推荐

